UserInfo.cpp
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:29k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. void UpdateStatusBarUsers(BOOL fGrow);
  3. void SendRDBSocket(int nCertification, char *pszData1, char *pszData2, int nData2Len);
  4. CUserInfo::CUserInfo()
  5. {
  6. m_bEmpty = true;
  7. m_pxPlayerObject = NULL;
  8. m_pGateInfo = NULL;
  9. m_nNumOfMagics = 0;
  10. m_nNumOfGenItems = 0;
  11. m_nNumOfItems = 0;
  12. m_lpTMagicErgumSkill = NULL;
  13. m_lpTMagicBanwolSkill = NULL;
  14. m_lpTMagicFireSwordSkill = NULL;
  15. m_lpTMagicOneSwordSkill = NULL;
  16. m_lpTMagicIlkwangSkill = NULL;
  17. m_lpTMagicPowerHitSkill = NULL;
  18. m_fLongHitSkill = FALSE;
  19. m_fWideHitSkill = FALSE;
  20. m_fFireHitSkill = FALSE;
  21. m_dwLatestFireHitTime = 0;
  22. }
  23. bool CUserInfo::IsEmpty()
  24. {
  25. return m_bEmpty;
  26. }
  27. /*
  28. void CUserInfo::RandomUpgradeItem(WORD wStdMode, _LPTMAKEITEMRCD lpMakeItemRcd)
  29. {
  30. if (wStdMode == 5 || wStdMode == 6)
  31. g_pStdItemWeapon[lpMakeItemRcd->nStdIndex - 1].UpgradeRandomItem(lpMakeItemRcd);
  32. else if (wStdMode == 10 || wStdMode == 11)
  33. g_pStdItemArmor[lpMakeItemRcd->nStdIndex - 1].UpgradeRandomItem(lpMakeItemRcd);
  34. else if (wStdMode >= 21 && wStdMode <= 50)
  35. g_pStdItemAccessory[lpMakeItemRcd->nStdIndex - 1].UpgradeRandomItem(lpMakeItemRcd);
  36. }
  37. */
  38. void CUserInfo::AddNewItem(char *pszItemName)
  39. {
  40. int i;
  41. // WORD wStdMode;
  42. _TMAKEITEMRCD MakeItemRcd;
  43. if (m_lpTItemRcd.GetCount() + m_lpTGenItemRcd.GetCount() > USERITEMMAX) return;
  44. int nLen = memlen(pszItemName) - 1;
  45. int nCmpLen;
  46. for (i = 0; i < g_nStdItemSpecial; i++)
  47. {
  48. nCmpLen = memlen(g_pStdItemSpecial[i].szName) - 1;
  49. if (nCmpLen == nLen)
  50. {
  51. if (memcmp(g_pStdItemSpecial[i].szName, pszItemName, nLen) == 0)
  52. {
  53. ZeroMemory(MakeItemRcd.btValue, sizeof(MakeItemRcd.btValue));
  54. MakeItemRcd.nStdIndex = i;
  55. switch (g_pStdItemSpecial[i].btType)
  56. {
  57. case 0:
  58. MakeItemRcd.szStdType = 'A';
  59. break;
  60. case 1:
  61. MakeItemRcd.szStdType = 'B';
  62. break;
  63. case 2:
  64. MakeItemRcd.szStdType = 'C';
  65. break;
  66. }
  67. MakeItemRcd.nDura = g_pStdItemSpecial[i].wDuraMax;
  68. MakeItemRcd.nDuraMax = g_pStdItemSpecial[i].wDuraMax;
  69. // wStdMode = g_pStdItemSpecial[i].wStdMode;
  70. if (rand() % 10 == 0)
  71. g_pStdItemSpecial[i].UpgradeRandomItem(MakeItemRcd.btValue, MakeItemRcd.nDura, MakeItemRcd.nDuraMax);
  72. MakeItemToDB((int)this, m_szUserID, m_szCharName, &MakeItemRcd);
  73. }
  74. }
  75. }
  76. for (i = 0; i < g_nStdItemEtc; i++)
  77. {
  78. nCmpLen = memlen(g_pStdItemEtc[i].szName) - 1;
  79. if (nCmpLen == nLen)
  80. {
  81. if (memcmp(g_pStdItemEtc[i].szName, pszItemName, nLen) == 0)
  82. {
  83. _LPTGENERALITEMRCD lptGenItemRcd = new _TGENERALITEMRCD;
  84. if (lptGenItemRcd)
  85. {
  86. // lptGenItemRcd->szStdType = g_pStdItemEtc[i].m_btType;
  87. lptGenItemRcd->nStdIndex = i;
  88. lptGenItemRcd->nDura = g_pStdItemEtc[i].wDuraMax;
  89. lptGenItemRcd->nDuraMax = g_pStdItemEtc[i].dwRSource;
  90. MakeGenItem(lptGenItemRcd);
  91. }
  92. return;
  93. }
  94. }
  95. }
  96. }
  97. void CUserInfo::MakeGenItem(_LPTGENERALITEMRCD lptGenItemRcd)
  98. {
  99. if (m_pxPlayerObject)
  100. {
  101. // Make Item on Server
  102. _TGENITEMRCD GenItemRcd;
  103. sprintf(GenItemRcd.szItem, "G%03d%04d%04d", lptGenItemRcd->nStdIndex, lptGenItemRcd->nDura, lptGenItemRcd->nDuraMax);
  104. memcpy(lptGenItemRcd->szMakeIndex, GenItemRcd.szItem, 12);
  105. m_lpTGenItemRcd.AddNewNode(lptGenItemRcd);
  106. _TCLIENTITEMRCD tClientItemRcd;
  107. _TDEFAULTMESSAGE SendDefMsg;
  108. char szEncodeMsg[256];
  109. fnMakeDefMessage(&SendDefMsg, SM_ADDITEM, (int)m_pxPlayerObject, 0, 0, 1);
  110. // Get Standard General Item (STDITEM_ETC)
  111. g_pStdItemEtc[lptGenItemRcd->nStdIndex].GetStandardItem(&tClientItemRcd);
  112. memcpy(tClientItemRcd.szMakeIndex, lptGenItemRcd->szMakeIndex, 12);
  113. tClientItemRcd.nDura = lptGenItemRcd->nDura;
  114. tClientItemRcd.nDuraMax = lptGenItemRcd->nDuraMax;
  115. int nIdx =  fnEncode6BitBufA((unsigned char *)&tClientItemRcd, szEncodeMsg, sizeof(_TCLIENTITEMRCD), sizeof(szEncodeMsg));
  116. szEncodeMsg[nIdx] = '';
  117. m_pxPlayerObject->SendSocket(&SendDefMsg, szEncodeMsg);
  118. }
  119. }
  120. int CUserInfo::GetDressFeature()
  121. {
  122. if (m_lpTItemRcd.GetCount())
  123. {
  124. PLISTNODE pListNode = m_lpTItemRcd.GetHead();
  125. while (pListNode)
  126. {
  127. _LPTUSERITEMRCD lpTItemRcd = m_lpTItemRcd.GetData(pListNode);
  128. if (memcmp(m_THumanRcd.szTakeItem[U_DRESS], lpTItemRcd->szMakeIndex, _MAKEITEMINDEX) == 0)
  129. return g_pStdItemSpecial[lpTItemRcd->nStdIndex].wShape;
  130. pListNode = m_lpTItemRcd.GetNext(pListNode);
  131. }
  132. }
  133. return 0;
  134. }
  135. int CUserInfo::GetWeaponFeature()
  136. {
  137. if (m_lpTItemRcd.GetCount())
  138. {
  139. PLISTNODE pListNode = m_lpTItemRcd.GetHead();
  140. while (pListNode)
  141. {
  142. _LPTUSERITEMRCD lpTItemRcd = m_lpTItemRcd.GetData(pListNode);
  143. if (memcmp(m_THumanRcd.szTakeItem[U_WEAPON], lpTItemRcd->szMakeIndex, _MAKEITEMINDEX) == 0)
  144. return g_pStdItemSpecial[lpTItemRcd->nStdIndex].wShape;
  145. pListNode = m_lpTItemRcd.GetNext(pListNode);
  146. }
  147. }
  148. return 0;
  149. }
  150. _LPTUSERITEMRCD CUserInfo::GetItem(char *pszMakeIndex)
  151. {
  152. if (m_lpTItemRcd.GetCount())
  153. {
  154. PLISTNODE pListNode = m_lpTItemRcd.GetHead();
  155. while (pListNode)
  156. {
  157. _LPTUSERITEMRCD lpTItemRcd = m_lpTItemRcd.GetData(pListNode);
  158. if (memcmp(pszMakeIndex, lpTItemRcd->szMakeIndex, _MAKEITEMINDEX) == 0)
  159. return lpTItemRcd;
  160. pListNode = m_lpTItemRcd.GetNext(pListNode);
  161. }
  162. }
  163. return NULL;
  164. }
  165. _LPTGENERALITEMRCD CUserInfo::GetUseGenItem(char *pszMakeItemID)
  166. {
  167. if (m_lpTGenItemRcd.GetCount())
  168. {
  169. PLISTNODE pListNode = m_lpTGenItemRcd.GetHead();
  170. while (pListNode)
  171. {
  172. _LPTGENERALITEMRCD lpTItemRcd = m_lpTGenItemRcd.GetData(pListNode);
  173. if (memcmp(pszMakeItemID, lpTItemRcd->szMakeIndex, _MAKEITEMINDEX) == 0)
  174. return lpTItemRcd;
  175. pListNode = m_lpTGenItemRcd.GetNext(pListNode);
  176. }
  177. }
  178. return NULL;
  179. }
  180. BOOL CUserInfo::IsMyMagic(int nIndex)
  181. {
  182. if (m_lpTMagicRcd.GetCount())
  183. {
  184. _LPTHUMANMAGICRCD lptUserMagicRcd;
  185. PLISTNODE pListNode = m_lpTMagicRcd.GetHead();
  186. while (pListNode)
  187. {
  188. lptUserMagicRcd = m_lpTMagicRcd.GetData(pListNode);
  189. if (lptUserMagicRcd->btMagicID == nIndex)
  190. return TRUE;
  191. pListNode = m_lpTMagicRcd.GetNext(pListNode);
  192. }
  193. }
  194. return FALSE;
  195. }
  196. int CUserInfo::EncodeMyMagicToServer(char *pszEncodeMsg, int nBuffSize, int& nPos)
  197. {
  198. int nCnt = 0;
  199. if (m_lpTMagicRcd.GetCount())
  200. {
  201. _LPTHUMANMAGICRCD lptUserMagicRcd;
  202. PLISTNODE pListNode = m_lpTMagicRcd.GetHead();
  203. while (pListNode)
  204. {
  205. lptUserMagicRcd = m_lpTMagicRcd.GetData(pListNode);
  206. if (lptUserMagicRcd)
  207. {
  208. nPos += fnEncode6BitBufA((unsigned char *)lptUserMagicRcd, pszEncodeMsg + nPos, sizeof(_THUMANMAGICRCD), nBuffSize - nPos);
  209. *(pszEncodeMsg + nPos) = '/';
  210. nPos++;
  211. nCnt++;
  212. }
  213. pListNode = m_lpTMagicRcd.GetNext(pListNode);
  214. }
  215. }
  216. return nCnt;
  217. }
  218. int CUserInfo::EncodeMyMagic(char *pszEncodeMsg, int nBuffSize, int& nPos)
  219. {
  220. int nCnt = 0;
  221. if (m_lpTMagicRcd.GetCount())
  222. {
  223. _LPTHUMANMAGICRCD lptUserMagicRcd;
  224. _TCLIENTMAGICRCD tClientMagicRcd;
  225. PLISTNODE pListNode = m_lpTMagicRcd.GetHead();
  226. while (pListNode)
  227. {
  228. lptUserMagicRcd = m_lpTMagicRcd.GetData(pListNode);
  229. if (lptUserMagicRcd)
  230. {
  231. tClientMagicRcd.btMagicID = lptUserMagicRcd->btMagicID;
  232. tClientMagicRcd.btLevel = lptUserMagicRcd->btLevel;
  233. tClientMagicRcd.btUseKey = lptUserMagicRcd->btUseKey;
  234. tClientMagicRcd.nCurrTrain = lptUserMagicRcd->nCurrTrain;
  235. tClientMagicRcd.tStdMagic.btEffect = (BYTE)g_pMagicInfo[lptUserMagicRcd->btMagicID].sEffect;
  236. tClientMagicRcd.tStdMagic.btEffectType = (BYTE)g_pMagicInfo[lptUserMagicRcd->btMagicID].sEffectType;
  237. memcpy(&tClientMagicRcd.tStdMagic.sNeed, g_pMagicInfo[lptUserMagicRcd->btMagicID].sNeed, sizeof(tClientMagicRcd.tStdMagic.sNeed));
  238. memcpy(&tClientMagicRcd.tStdMagic.nTrain, g_pMagicInfo[lptUserMagicRcd->btMagicID].nTrain, sizeof(tClientMagicRcd.tStdMagic.nTrain));
  239. tClientMagicRcd.tStdMagic.btDefSpell = (BYTE)g_pMagicInfo[lptUserMagicRcd->btMagicID].sDefSpell;
  240. tClientMagicRcd.tStdMagic.nDelayTime = g_pMagicInfo[lptUserMagicRcd->btMagicID].sDelay;
  241. nPos += fnEncode6BitBufA((unsigned char *)&tClientMagicRcd, pszEncodeMsg + nPos, sizeof(_TCLIENTMAGICRCD), nBuffSize - nPos);
  242. *(pszEncodeMsg + nPos) = '/';
  243. nPos++;
  244. nCnt++;
  245. }
  246. pListNode = m_lpTMagicRcd.GetNext(pListNode);
  247. }
  248. }
  249. return nCnt;
  250. }
  251. void CUserInfo::RemoveGenItem(_LPTGENERALITEMRCD lptItemRcd)
  252. {
  253. if (m_lpTGenItemRcd.GetCount())
  254. {
  255. _LPTGENERALITEMRCD lptGenItemRcd;
  256. PLISTNODE pListNode = m_lpTGenItemRcd.GetHead();
  257. while (pListNode)
  258. {
  259. lptGenItemRcd = m_lpTGenItemRcd.GetData(pListNode);
  260. if (lptGenItemRcd == lptItemRcd)
  261. {
  262. m_lpTGenItemRcd.RemoveNode(pListNode);
  263. delete lptGenItemRcd;
  264. lptGenItemRcd = NULL;
  265. return;
  266. }
  267. pListNode = m_lpTGenItemRcd.GetNext(pListNode);
  268. }
  269. }
  270. }
  271. int CUserInfo::EncodeGenItem(char *pszEncodeMsg, int nBuffSize, int& nPos)
  272. {
  273. int nCnt = 0;
  274. if (m_lpTGenItemRcd.GetCount())
  275. {
  276. _LPTGENERALITEMRCD lptGenItemRcd;
  277. _TGENITEMRCD GenItemRcd;
  278. TCHAR wszItem[13];
  279. PLISTNODE pListNode = m_lpTGenItemRcd.GetHead();
  280. while (pListNode)
  281. {
  282. lptGenItemRcd = m_lpTGenItemRcd.GetData(pListNode);
  283. if (lptGenItemRcd)
  284. {
  285. wsprintf(wszItem, _TEXT("G%03d%04d%04d"), lptGenItemRcd->nStdIndex, lptGenItemRcd->nDura, lptGenItemRcd->nDuraMax);
  286. WideCharToMultiByte(CP_ACP, 0, wszItem, -1, GenItemRcd.szItem, sizeof(GenItemRcd.szItem), NULL, NULL);
  287. nPos += fnEncode6BitBufA((unsigned char *)&GenItemRcd, pszEncodeMsg + nPos, sizeof(_TGENITEMRCD), nBuffSize - nPos);
  288. *(pszEncodeMsg + nPos) = '/';
  289. nPos++;
  290. nCnt++;
  291. }
  292. pListNode = m_lpTGenItemRcd.GetNext(pListNode);
  293. }
  294. }
  295. return nCnt;
  296. }
  297. void CUserInfo::AllowLongHitSkill(BOOL fFlag)
  298. {
  299. TCHAR szText[64];
  300. char szMsg[64];
  301. m_fLongHitSkill = fFlag;
  302. if (m_fLongHitSkill)
  303. LoadString(g_hInst, IDS_ALLOW_LONGHIT, szText, sizeof(szText)/sizeof(TCHAR));
  304. else
  305. LoadString(g_hInst, IDS_NOTALLOW_LONGHIT, szText, sizeof(szText)/sizeof(TCHAR));
  306. WideCharToMultiByte(CP_ACP, 0, szText, -1, szMsg, sizeof(szMsg), NULL, NULL);
  307. m_pxPlayerObject->SysMsg(szMsg, 1);
  308. }
  309. void CUserInfo::AllowWideHitSkill(BOOL fFlag)
  310. {
  311. TCHAR szText[64];
  312. char szMsg[64];
  313. m_fWideHitSkill = fFlag;
  314. if (m_fWideHitSkill)
  315. LoadString(g_hInst, IDS_ALLOW_WIDEHIT, szText, sizeof(szText)/sizeof(TCHAR));
  316. else
  317. LoadString(g_hInst, IDS_NOTALLOW_WIDEHIT, szText, sizeof(szText)/sizeof(TCHAR));
  318. WideCharToMultiByte(CP_ACP, 0, szText, -1, szMsg, sizeof(szMsg), NULL, NULL);
  319. m_pxPlayerObject->SysMsg(szMsg, 1);
  320. }
  321. BOOL CUserInfo::AllowFireHitSkill()
  322. {
  323. TCHAR szText[128];
  324. char szMsg[128];
  325. if (GetTickCount() - m_dwLatestFireHitTime > 10 * 1000)
  326. {
  327. m_fFireHitSkill = TRUE;
  328. m_dwLatestFireHitTime = GetTickCount();
  329. LoadString(g_hInst, IDS_ALLOW_FIREHIT, szText, sizeof(szText)/sizeof(TCHAR));
  330. WideCharToMultiByte(CP_ACP, 0, szText, -1, szMsg, sizeof(szMsg), NULL, NULL);
  331. m_pxPlayerObject->SysMsg(szMsg, 1);
  332. return TRUE;
  333. }
  334. else
  335. {
  336. LoadString(g_hInst, IDS_NOTALLOW_FIREHIT, szText, sizeof(szText)/sizeof(TCHAR));
  337. WideCharToMultiByte(CP_ACP, 0, szText, -1, szMsg, sizeof(szMsg), NULL, NULL);
  338. m_pxPlayerObject->SysMsg(szMsg, 0);
  339. }
  340. return FALSE;
  341. }
  342. int CUserInfo::GetGenItemStdIdx(char *pszMakeIndex)
  343. {
  344. char szStdIdx[5];
  345. ZeroMemory(szStdIdx, sizeof(szStdIdx));
  346. memmove(szStdIdx, &pszMakeIndex[1], 3);
  347. return AnsiStrToVal(szStdIdx);
  348. }
  349. int CUserInfo::GetGenItemVal1(char *pszMakeIndex)
  350. {
  351. char szVal1[5];
  352. ZeroMemory(szVal1, sizeof(szVal1));
  353. memmove(szVal1, &pszMakeIndex[4], 4);
  354. return AnsiStrToVal(szVal1);
  355. }
  356. int CUserInfo::GetGenItemVal2(char *pszMakeIndex)
  357. {
  358. char szVal2[5];
  359. ZeroMemory(szVal2, sizeof(szVal2));
  360. memmove(szVal2, &pszMakeIndex[8], 4);
  361. return AnsiStrToVal(szVal2);
  362. }
  363. int CUserInfo::CalcBagWeight()
  364. {
  365. int nWeight = 0;
  366. if (m_lpTItemRcd.GetCount())
  367. {
  368. PLISTNODE pListNode = m_lpTItemRcd.GetHead();
  369. while (pListNode)
  370. {
  371. _LPTUSERITEMRCD lpTItemRcd = m_lpTItemRcd.GetData(pListNode);
  372. if (lpTItemRcd)
  373. nWeight += g_pStdItemSpecial[lpTItemRcd->nStdIndex].wWeight;
  374. pListNode = m_lpTItemRcd.GetNext(pListNode);
  375. }
  376. }
  377. if (m_lpTGenItemRcd.GetCount())
  378. {
  379. _LPTGENERALITEMRCD lptGenItemRcd;
  380. PLISTNODE pListNode = m_lpTGenItemRcd.GetHead();
  381. while (pListNode)
  382. {
  383. lptGenItemRcd = m_lpTGenItemRcd.GetData(pListNode);
  384. if (lptGenItemRcd)
  385. nWeight += g_pStdItemEtc[lptGenItemRcd->nStdIndex].wWeight;
  386. pListNode = m_lpTGenItemRcd.GetNext(pListNode);
  387. }
  388. }
  389. return nWeight;
  390. }
  391. int CUserInfo::CalcWearWeightEx(int nIndex)
  392. {
  393. _LPTUSERITEMRCD lptItemRcd;
  394. int nWeight = 0;
  395. for (int i = 0; i < 8; i++)
  396. {
  397. if ((i != nIndex) && (i != U_WEAPON) && (i != U_RIGHTHAND))
  398. {
  399. lptItemRcd = GetUseItem(i);
  400. if (lptItemRcd)
  401. nWeight += g_pStdItemSpecial[lptItemRcd->nStdIndex].wWeight;
  402. }
  403. }
  404. return nWeight;
  405. }
  406. BOOL CUserInfo::UserDropItem(int nItemIndex, char *pszMakeIndex)
  407. {
  408. if (!m_pxPlayerObject) return FALSE;
  409. if (m_lpTItemRcd.GetCount())
  410. {
  411. PLISTNODE pListNode = m_lpTItemRcd.GetHead();
  412. while (pListNode)
  413. {
  414. _LPTUSERITEMRCD lpTItemRcd = m_lpTItemRcd.GetData(pListNode);
  415. if (memcmp(pszMakeIndex, lpTItemRcd->szMakeIndex, _MAKEITEMINDEX) == 0)
  416. {
  417. if (m_pxPlayerObject->DropItemDown(lpTItemRcd, 2, FALSE))
  418. {
  419. m_pxPlayerObject->UpdateItemToDB(lpTItemRcd, _ITEM_ACTION_THROW);
  420. // delete lpTItemRcd;
  421. m_lpTItemRcd.RemoveNode(pListNode);
  422. m_pxPlayerObject->WeightChanged();
  423. return TRUE;
  424. }
  425. }
  426. pListNode = m_lpTItemRcd.GetNext(pListNode);
  427. }
  428. }
  429. return FALSE;
  430. }
  431. BOOL CUserInfo::UserDropGenItem(int nItemIndex, char *pszMakeIndex)
  432. {
  433. if (!m_pxPlayerObject) return FALSE;
  434. if (m_lpTGenItemRcd.GetCount())
  435. {
  436. PLISTNODE pListNode = m_lpTGenItemRcd.GetHead();
  437. while (pListNode)
  438. {
  439. _LPTGENERALITEMRCD lpTItemRcd = m_lpTGenItemRcd.GetData(pListNode);
  440. if (memcmp(pszMakeIndex, lpTItemRcd->szMakeIndex, _MAKEITEMINDEX) == 0)
  441. {
  442. if (m_pxPlayerObject->DropItemDown((_LPTUSERITEMRCD)lpTItemRcd, 2, TRUE))
  443. {
  444. // delete lpTItemRcd;
  445. m_lpTGenItemRcd.RemoveNode(pListNode);
  446. m_pxPlayerObject->WeightChanged();
  447. return TRUE;
  448. }
  449. }
  450. pListNode = m_lpTGenItemRcd.GetNext(pListNode);
  451. }
  452. }
  453. return FALSE;
  454. }
  455. BOOL CUserInfo::IncGold(int nGold)
  456. {
  457. if (m_THumanRcd.dwGold + nGold <= BAGGOLD)
  458. {
  459. m_THumanRcd.dwGold  += nGold;
  460. return TRUE;
  461. }
  462. return FALSE;
  463. }
  464. BOOL CUserInfo::DecGold(int nGold)
  465. {
  466. if (m_THumanRcd.dwGold - nGold >= 0)
  467. {
  468. m_THumanRcd.dwGold  -= nGold;
  469. return TRUE;
  470. }
  471. return FALSE;
  472. }
  473. _LPTHUMANMAGICRCD CUserInfo::GetMagicRcdByKey(int nKey)
  474. {
  475. PLISTNODE pListNode = m_lpTMagicRcd.GetHead();
  476. while (pListNode)
  477. {
  478. _LPTHUMANMAGICRCD lptUserMagicRcd = m_lpTMagicRcd.GetData(pListNode);
  479. if (lptUserMagicRcd)
  480. {
  481. if (lptUserMagicRcd->btUseKey == nKey)
  482. return lptUserMagicRcd;
  483. }
  484. pListNode = m_lpTMagicRcd.GetNext(pListNode);
  485. }
  486. return NULL;
  487. }
  488. _LPTHUMANMAGICRCD CUserInfo::GetMagicRcdByID(int nID)
  489. {
  490. PLISTNODE pListNode = m_lpTMagicRcd.GetHead();
  491. while (pListNode)
  492. {
  493. _LPTHUMANMAGICRCD lptUserMagicRcd = m_lpTMagicRcd.GetData(pListNode);
  494. if (lptUserMagicRcd)
  495. {
  496. if (lptUserMagicRcd->btMagicID == nID)
  497. return lptUserMagicRcd;
  498. }
  499. pListNode = m_lpTMagicRcd.GetNext(pListNode);
  500. }
  501. return NULL;
  502. }
  503. _LPTGENERALITEMRCD CUserInfo::CanUseBujuk()
  504. {
  505. _LPTGENERALITEMRCD lptItem = GetUseGenItem(m_THumanRcd.szTakeItem[U_ARMRINGL]);
  506. if (lptItem)
  507. {
  508. if (lptItem->szMakeIndex[0] == 'G')
  509. {
  510. int nIndex = GetGenItemStdIdx(lptItem->szMakeIndex);
  511. if (g_pStdItemEtc[nIndex].wStdMode == 25 || g_pStdItemEtc[nIndex].wStdMode == 5)
  512. return lptItem;
  513. }
  514. }
  515. return NULL;
  516. }
  517. void CUserInfo::ProcessUserMessage(char *pszPacket)
  518. {
  519. _LPTDEFAULTMESSAGE lpDefMsg = (_LPTDEFAULTMESSAGE)pszPacket;
  520. if (m_pxPlayerObject->m_fIsCapture)
  521. {
  522. if (m_pxPlayerObject->m_hCaptureFile)
  523. {
  524. DWORD dwWrite = 0;
  525. fprintf(m_pxPlayerObject->m_hCaptureFile, "%d, %d, %d, %d, %drn", lpDefMsg->wIdent, lpDefMsg->nRecog, lpDefMsg->wParam, lpDefMsg->wTag, lpDefMsg->wSeries);
  526. switch (lpDefMsg->wIdent)
  527. {
  528. case CM_SAY:
  529. case CM_PICKUP:
  530. {
  531. char szDecodeMsg[512];
  532. int nPos = fnDecode6BitBufA(pszPacket + sizeof(_TDEFAULTMESSAGE), szDecodeMsg, sizeof(szDecodeMsg));
  533. szDecodeMsg[nPos] = '';
  534. fprintf(m_pxPlayerObject->m_hCaptureFile, "%srn", szDecodeMsg);
  535. }
  536. }
  537. }
  538. }
  539. switch (lpDefMsg->wIdent)
  540. {
  541. case CM_HIT:
  542. case CM_POWERHIT:
  543. case CM_LONGHIT:
  544. case CM_WIDEHIT:
  545. case CM_HEAVYHIT:
  546. case CM_BIGHIT:
  547. case CM_FIREHIT:
  548. m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wTag, LOWORD(lpDefMsg->nRecog), HIWORD(lpDefMsg->nRecog), lpDefMsg->wParam, NULL);
  549. break;
  550. case CM_TURN:
  551. case CM_WALK:
  552. case CM_RUN:
  553. case CM_SITDOWN:
  554. case CM_RIDE:
  555. m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wTag, LOWORD(lpDefMsg->nRecog), HIWORD(lpDefMsg->nRecog), NULL);
  556. break;
  557. case CM_SAY:
  558. m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, 0, 0, 0, 0, pszPacket + sizeof(_TDEFAULTMESSAGE));
  559. break;
  560. case CM_SPELL:
  561. m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, 
  562. lpDefMsg->wTag/*MagicID*/, LOWORD(lpDefMsg->nRecog)/*TargetX*/, HIWORD(lpDefMsg->nRecog)/*TargetY*/, 
  563. MAKELONG(lpDefMsg->wSeries, lpDefMsg->wParam)/*TargetObj*/, NULL);
  564. break;
  565. case CM_TAKEONITEM:
  566. case CM_TAKEOFFITEM:
  567. m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wSeries, lpDefMsg->nRecog, lpDefMsg->wParam, lpDefMsg->wTag, pszPacket + sizeof(_TDEFAULTMESSAGE));
  568. break;
  569.         case CM_QUERYUSERNAME:
  570. m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, 0, lpDefMsg->nRecog, lpDefMsg->wParam, lpDefMsg->wTag, NULL);
  571. break;
  572. case CM_EAT:
  573. case CM_DROPITEM:
  574. m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wSeries, 0, 0, 0, pszPacket + sizeof(_TDEFAULTMESSAGE));
  575. break;
  576. case CM_PICKUP:
  577. m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wSeries, lpDefMsg->nRecog, lpDefMsg->wTag, lpDefMsg->wParam);
  578. break;
  579. default:
  580. m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wSeries, lpDefMsg->nRecog, lpDefMsg->wTag, NULL);
  581. }
  582. /* case CM_QUERYUSERNAME:
  583.             begin
  584.                hum.SendMsg (hum, pmsg.Ident, 0, pmsg.Recog, pmsg.Param{x}, pmsg.Tag{y}, '');
  585.             end;
  586.          //string 颇扼皋磐啊 乐澜.
  587. case CM_DROPITEM:
  588. case CM_TAKEOFFITEM:
  589. case CM_EXCHGTAKEONITEM:
  590. case CM_MERCHANTDLGSELECT:
  591. case CM_MERCHANTQUERYSELLPRICE:
  592. case CM_MERCHANTQUERYREPAIRCOST:
  593. case CM_USERSELLITEM:
  594. case CM_USERREPAIRITEM:
  595. case CM_USERSTORAGEITEM:
  596. case CM_USERBUYITEM:
  597. case CM_USERGETDETAILITEM:
  598. case CM_CREATEGROUP:
  599. case CM_ADDGROUPMEMBER:
  600. case CM_DELGROUPMEMBER:
  601. case CM_DEALTRY:
  602. case CM_DEALADDITEM:
  603. case CM_DEALDELITEM:
  604. case CM_USERTAKEBACKSTORAGEITEM:
  605. case CM_USERMAKEDRUGITEM:
  606. case CM_GUILDADDMEMBER:
  607. case CM_GUILDDELMEMBER:
  608. case CM_GUILDUPDATENOTICE:
  609. case CM_GUILDUPDATERANKINFO:
  610.          :
  611.             begin
  612.                hum.SendMsg (hum, pmsg.Ident, pmsg.Series, pmsg.Recog, pmsg.Param, pmsg.Tag, DecodeString(body));
  613.             end;
  614. case CM_ADJUST_BONUS:
  615.          :
  616.             begin
  617.                hum.SendMsg (hum, pmsg.Ident, pmsg.Series, pmsg.Recog, pmsg.Param, pmsg.Tag, body);
  618.             end;
  619.          else
  620.             hum.SendMsg (hum, pmsg.Ident, pmsg.Series, pmsg.Recog, pmsg.Param, pmsg.Tag, '');
  621.       end;
  622. }
  623. /*
  624. char szEncodeMsg[256];
  625. switch (lpDefMsg->wIdent)
  626. {
  627. case CM_TURN:
  628. {
  629. if (pUserInfo->m_pxPlayerObject->TurnXY(lpDefMsg->wTag, LOWORD(lpDefMsg->nRecog), HIWORD(lpDefMsg->nRecog)))
  630. memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
  631. else
  632. memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));
  633. ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
  634. pUserInfo->m_pxPlayerObject->SendSocket(NULL, szEncodeMsg);
  635. break;
  636. }
  637. case CM_WALK:
  638. {
  639. if (pUserInfo->m_pxPlayerObject->WalkTo(lpDefMsg->wTag))
  640. memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
  641. else
  642. memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));
  643. ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
  644. pUserInfo->m_pxPlayerObject->SendSocket(NULL, szEncodeMsg);
  645. break;
  646. }
  647. case CM_RUN:
  648. {
  649. if (pUserInfo->m_pxPlayerObject->RunTo(lpDefMsg->wTag))
  650. memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
  651. else
  652. memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));
  653. ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
  654. pUserInfo->m_pxPlayerObject->SendSocket(NULL, szEncodeMsg);
  655. break;
  656. }
  657. /* case CM_HIT:
  658. {
  659. if (HitXY(lpProcessMsg->wIdent, lpProcessMsg->lParam1, lpProcessMsg->lParam2, lpProcessMsg->wParam))
  660. memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
  661. else
  662. memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));
  663. ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
  664. SendSocket(NULL, szEncodeMsg);
  665. break;
  666. }
  667. case CM_RIDE:
  668. {
  669. if (DoRideHorse(lpProcessMsg->wParam, lpProcessMsg->lParam1))
  670. memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
  671. else
  672. memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));
  673. ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
  674. SendSocket(NULL, szEncodeMsg);
  675. break;
  676. }
  677. case CM_SAY:
  678. {
  679. if (lpProcessMsg->pszData)
  680. ProcessForUserSaid(lpProcessMsg);
  681. break;
  682. }
  683. case CM_SPELL:
  684. {
  685. if (SpellXY(lpProcessMsg->wParam, lpProcessMsg->lParam1, lpProcessMsg->lParam2, lpProcessMsg->lParam3))
  686. memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
  687. else
  688. memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));
  689. ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
  690. SendSocket(NULL, szEncodeMsg);
  691. break;
  692. }
  693. case CM_TAKEONITEM:
  694. {
  695. lpProcessMsg->pCharObject->m_tFeature.btGender = lpProcessMsg->wParam;
  696. lpProcessMsg->pCharObject->m_tFeature.btWear = HIBYTE(lpProcessMsg->lParam1);
  697. lpProcessMsg->pCharObject->m_tFeature.btHair = LOBYTE(lpProcessMsg->lParam1);
  698. lpProcessMsg->pCharObject->m_tFeature.btWeapon = lpProcessMsg->lParam2;
  699. //AddRefMsg(
  700. break;
  701. }
  702. } */
  703. }
  704. void CUserInfo::Operate()
  705. {
  706. if (GetTickCount() - m_pxPlayerObject->m_dwSearchTime >= m_pxPlayerObject->m_dwSearchTick)
  707. {
  708. m_pxPlayerObject->m_dwSearchTime = GetTickCount();
  709. m_pxPlayerObject->SearchViewRange();
  710. if (m_pxPlayerObject->m_btBright != g_nMirDayTime)
  711. {
  712. m_pxPlayerObject->m_btBright = g_nMirDayTime;
  713. m_pxPlayerObject->AddProcess(m_pxPlayerObject, RM_DAYCHANGING, 0, 0, 0, 0, NULL);
  714. }
  715. }
  716. m_pxPlayerObject->Operate();
  717. }
  718. void CUserInfo::CloseUserHuman()
  719. {
  720. Lock();
  721. if (m_pxPlayerObject)
  722. {
  723. m_THumanRcd.nCX = m_pxPlayerObject->m_nCurrX;
  724. m_THumanRcd.nCY = m_pxPlayerObject->m_nCurrY;
  725. if (m_pxPlayerObject->m_nDirection >= 0 && m_pxPlayerObject->m_nDirection <= 7)
  726. m_THumanRcd.nDirection = m_pxPlayerObject->m_nDirection;
  727. else
  728. m_THumanRcd.nDirection = 4;
  729. if (m_pxPlayerObject->m_pMap)
  730. {
  731. ZeroMemory(m_THumanRcd.szMapName, sizeof(m_THumanRcd.szMapName));
  732. memcpy(m_THumanRcd.szMapName, m_pxPlayerObject->m_pMap->m_szMapName, memlen(m_pxPlayerObject->m_pMap->m_szMapName));
  733. }
  734. m_THumanRcd.szLevel = m_pxPlayerObject->m_Ability.Level;
  735. m_THumanRcd.nExp = m_pxPlayerObject->m_Ability.Exp;
  736. m_THumanRcd.nExp = m_pxPlayerObject->m_Ability.Exp;
  737. // Save Player Information Data
  738. SaveHumanToDB("192.168.0.200");
  739. }
  740. if (m_pxPlayerObject)
  741. {   
  742. PLISTNODE pVisibleObjListNode = m_pxPlayerObject->m_xVisibleObjectList.GetHead();
  743. while (pVisibleObjListNode)
  744. {
  745. CVisibleObject* pVisibleObject = m_pxPlayerObject->m_xVisibleObjectList.GetData(pVisibleObjListNode);
  746. if (pVisibleObject) 
  747. {
  748. delete pVisibleObject;
  749. pVisibleObject = NULL;
  750. }
  751. pVisibleObjListNode = m_pxPlayerObject->m_xVisibleObjectList.RemoveNode(pVisibleObjListNode);
  752. }
  753. m_pxPlayerObject->m_pMap->RemoveObject(m_pxPlayerObject->m_nCurrX,m_pxPlayerObject->m_nCurrY,
  754. OS_MOVINGOBJECT, m_pxPlayerObject);
  755. m_pxPlayerObject->m_fIsAlive = FALSE;
  756. }
  757. PLISTNODE pListNode;
  758. // Remove User Item
  759. if (m_lpTItemRcd.GetCount())
  760. {
  761. pListNode = m_lpTItemRcd.GetHead();
  762. while (pListNode)
  763. {
  764. _LPTUSERITEMRCD lpUserItemRcd = m_lpTItemRcd.GetData(pListNode);
  765. if (lpUserItemRcd) 
  766. {
  767. delete lpUserItemRcd;
  768. lpUserItemRcd = NULL;
  769. }
  770. pListNode = m_lpTItemRcd.RemoveNode(pListNode);
  771. }
  772. }
  773. // Remove General User Item
  774. if (m_lpTGenItemRcd.GetCount())
  775. {
  776. pListNode = m_lpTGenItemRcd.GetHead();
  777. while (pListNode)
  778. {
  779. _LPTGENERALITEMRCD lpGenItemRcd = m_lpTGenItemRcd.GetData(pListNode);
  780. if (lpGenItemRcd) 
  781. {
  782. delete lpGenItemRcd;
  783. lpGenItemRcd = NULL;
  784. }
  785. pListNode = m_lpTGenItemRcd.RemoveNode(pListNode);
  786. }
  787. }
  788. // Remove User Magic Information
  789. if (m_lpTMagicRcd.GetCount())
  790. {
  791. pListNode = m_lpTMagicRcd.GetHead();
  792. while (pListNode)
  793. {
  794. _LPTHUMANMAGICRCD lpMagicRcd = m_lpTMagicRcd.GetData(pListNode);
  795. if (lpMagicRcd) 
  796. {
  797. delete lpMagicRcd;
  798. lpMagicRcd = NULL;
  799. }
  800. pListNode = m_lpTMagicRcd.RemoveNode(pListNode);
  801. }
  802. }
  803. if (m_pxPlayerObject)
  804. CloseAccount(m_szUserID, m_nCertification);
  805. m_bEmpty = true;
  806. Unlock();
  807. UpdateStatusBarUsers(FALSE);
  808. }
  809. void CUserInfo::SaveHumanToDB(char *pszUserAddr)
  810. {
  811. _TDEFAULTMESSAGE Def;
  812. _TLOADHUMAN tLoadHuman;
  813. char szEncodeMsg1[24];
  814. char szEncodeMsg2[8192];
  815. fnMakeDefMessage(&Def, DB_SAVEHUMANRCD, (int)this, m_lpTMagicRcd.GetCount(), m_lpTGenItemRcd.GetCount(), 0);
  816. memcpy(tLoadHuman.szUserID, m_szUserID, memlen(m_szUserID));
  817. memcpy(tLoadHuman.szCharName, m_szCharName, memlen(m_szCharName));
  818. memcpy(tLoadHuman.szUserAddr, pszUserAddr, memlen(pszUserAddr));
  819. tLoadHuman.nCertification = m_nCertification;
  820. int nPos = fnEncodeMessageA(&Def, szEncodeMsg1, sizeof(szEncodeMsg1));
  821. szEncodeMsg1[nPos] = '';
  822. nPos = fnEncode6BitBufA((unsigned char *)&tLoadHuman, szEncodeMsg2, sizeof(_TLOADHUMAN), sizeof(szEncodeMsg2));
  823. nPos += fnEncode6BitBufA((unsigned char *)&m_THumanRcd, &szEncodeMsg2[nPos], sizeof(_THUMANRCD), sizeof(szEncodeMsg2) - nPos);
  824. // BEGIN:Add Magic Information
  825. EncodeMyMagicToServer(szEncodeMsg2, sizeof(szEncodeMsg2) - nPos, nPos);
  826. // END
  827. // BEGIN:Add General Item Information
  828. EncodeGenItem(szEncodeMsg2, sizeof(szEncodeMsg2) - nPos, nPos);
  829. // END
  830. szEncodeMsg2[nPos] = '';
  831. SendRDBSocket(tLoadHuman.nCertification, szEncodeMsg1, szEncodeMsg2, nPos);
  832. }
  833. void CUserInfo::CloseAccount(char *pszName, int nCertification)
  834. {
  835. char szMsg[256];
  836. int nLen = memlen(pszName) - 1;
  837. szMsg[0] = '%';
  838. szMsg[1] = 'S';
  839. memcpy(&szMsg[2], pszName, nLen);
  840. szMsg[nLen + 2] = '/';
  841. char *pszPos = ValToAnsiStr(nCertification, &szMsg[nLen + 3]);
  842. *pszPos++ = '$';
  843. *pszPos = '';
  844. send(g_clsock, szMsg, memlen(szMsg) - 1, 0);
  845. }
  846. void CUserInfo::DoClientCertification(char *pszPacket)
  847. {
  848. char szDecodePacket[64];
  849. char *pszDecodePacket = &szDecodePacket[0];
  850. char *pszPos;
  851. if (m_btCurrentMode == USERMODE_NOTICE)
  852. {
  853. int nLen = memlen(pszPacket);
  854. if (pszPos = (char *)memchr(pszPacket, '!', nLen))
  855. {
  856. *pszPos = '';
  857. //             uid  chr  cer  ver  startnew
  858. // pszPacket **SSSS/SSSS/SSSS/SSSS/1
  859. nLen = fnDecode6BitBufA(pszPacket + 2, szDecodePacket, sizeof(szDecodePacket));
  860. szDecodePacket[nLen] = '';
  861. if (*pszDecodePacket == '*' && *(pszDecodePacket + 1) == '*')
  862. {
  863. pszDecodePacket += 2;
  864. if (!(pszPos = (char *)memchr(pszDecodePacket, '/', nLen))) return;
  865. *pszPos++ = '';
  866. nLen -= (pszPos - pszDecodePacket);
  867. memmove(m_szUserID, pszDecodePacket, (pszPos - pszDecodePacket));
  868. pszDecodePacket = pszPos;
  869. if (!(pszPos = (char *)memchr(pszDecodePacket, '/', nLen))) return;
  870. *pszPos++ = '';
  871. nLen -= (pszPos - pszDecodePacket);
  872. memmove(m_szCharName, pszDecodePacket, (pszPos - pszDecodePacket));
  873. pszDecodePacket = pszPos;
  874. if (!(pszPos = (char *)memchr(pszDecodePacket, '/', nLen))) return;
  875. *pszPos++ = '';
  876. nLen -= (pszPos - pszDecodePacket);
  877. m_nCertification = AnsiStrToVal(pszDecodePacket);
  878. pszDecodePacket = pszPos;
  879. if (!(pszPos = (char *)memchr(pszDecodePacket, '/', nLen))) return;
  880. *pszPos++ = '';
  881. nLen -= (pszPos - pszDecodePacket);
  882. m_nClientVersion = AnsiStrToVal(pszDecodePacket);
  883. pszDecodePacket = pszPos;
  884. m_btCurrentMode = USERMODE_LOGIN;
  885. // (*pszDecodePacket == '0' ? StartNew = TRUE : StartNew = FALSE);
  886. // INSERT:Check pay bill.
  887. // if (pUserInfo->m_nCertification >= 30)
  888. // {
  889. // LoadPlayer(pUserInfo);
  890. // }
  891. /* else
  892. {
  893. // INSERT:Close User
  894. } */
  895. }
  896. }
  897. }
  898. }