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

模拟服务器

开发平台:

C/C++

  1.  #include "KEngine.h"
  2. #include "KCore.h"
  3. #include "SkillDef.h"
  4. #include "KSkillList.h"
  5. #ifndef _STANDALONE
  6. #include "../../../lib/S3DBInterface.h"
  7. #include "crtdbg.h"
  8. #else
  9. #include "S3DBInterface.h"
  10. #endif
  11. #include "KSkills.h"
  12. #include "KPlayer.h"
  13. #ifndef _SERVER
  14. #include "cOREsHELL.H"
  15. #endif
  16. KSkillList::KSkillList()
  17. {
  18. ZeroMemory(m_Skills, sizeof(NPCSKILL) * MAX_NPCSKILL);
  19. m_nNpcIndex = 0;
  20. }
  21. KSkillList::~KSkillList()
  22. {
  23. }
  24. static int g_CallCount = 0;
  25. int KSkillList::FindSame(int nSkillID)
  26. {
  27.     g_CallCount++;
  28. if (!nSkillID)
  29. return 0;
  30. for (int i=1; i<MAX_NPCSKILL; i++)
  31. {
  32. if (m_Skills[i].SkillId == nSkillID)
  33. {
  34. return i;
  35. }
  36. }
  37. return 0;
  38. }
  39. int KSkillList::FindFree()
  40. {
  41. for (int i = 1; i < MAX_NPCSKILL; i++)
  42. {
  43. if (!m_Skills[i].SkillId)
  44. {
  45. return i;
  46. }
  47. }
  48. return 0;
  49. }
  50. #ifdef _SERVER
  51. void KSkillList::SetNpcSkill(int nSkillNo, int nSkillId, int nSkillLevel)
  52. {
  53. if (nSkillNo <= 0 || nSkillLevel <= 0 || nSkillId <= 0)
  54. return ;
  55. if (nSkillNo >= MAX_NPCSKILL) 
  56. return ;
  57. m_Skills[nSkillNo].SkillId = nSkillId;
  58. m_Skills[nSkillNo].CurrentSkillLevel = nSkillLevel;
  59. m_Skills[nSkillNo].SkillLevel = nSkillLevel;
  60. m_Skills[nSkillNo].MaxTimes = 0;
  61. m_Skills[nSkillNo].RemainTimes = 0;
  62. _ASSERT(nSkillId > 0 && nSkillLevel > 0);
  63. KSkill * pOrdinSkill = (KSkill *) g_SkillManager.GetSkill(nSkillId, nSkillLevel);
  64. if (!pOrdinSkill) 
  65.         return ;
  66.     if (pOrdinSkill->GetSkillStyle() == SKILL_SS_PassivityNpcState)
  67. {
  68. pOrdinSkill->Cast(m_nNpcIndex, -1, m_nNpcIndex);
  69. }
  70. }
  71. void KSkillList::RemoveNpcSkill(int nSkillNo)
  72. {
  73. if (nSkillNo <= 0 )
  74. return ;
  75. if (nSkillNo >= MAX_NPCSKILL) 
  76. return ;
  77. m_Skills[nSkillNo].SkillId = 0;
  78. m_Skills[nSkillNo].CurrentSkillLevel = 0;
  79. m_Skills[nSkillNo].SkillLevel = 0;
  80. m_Skills[nSkillNo].MaxTimes = 0;
  81. m_Skills[nSkillNo].RemainTimes = 0;
  82. }
  83. #endif
  84. int KSkillList::GetCount()
  85. {
  86. int nCount = 0;
  87. for (int i = 1; i < MAX_NPCSKILL; i++)
  88. {
  89. if (m_Skills[i].SkillId)
  90. {
  91. nCount++;
  92. }
  93. }
  94. return nCount;
  95. }
  96. #ifndef _SERVER
  97. void KSkillList::SetSkillLevel(int nId/*技能的ID号*/, int nLevel)
  98. {
  99. int i = FindSame(nId);
  100. if (!i)
  101. {
  102. Add(nId, nLevel);
  103. return;
  104. }
  105. else
  106. //m_Skills[i].SkillLevel = nLevel;
  107. SetLevel(i, nLevel);
  108. }
  109. #endif
  110. #ifndef _SERVER
  111. BOOL KSkillList::SetLevel(int nIndex/*技能列表的索引号*/, int nLevel)
  112. {
  113. if (nIndex <= 0 || nIndex >= MAX_NPCSKILL)
  114. return FALSE;
  115. if (nLevel < 0 || nLevel >= MAX_SKILLLEVEL)
  116. return FALSE;
  117. int nInc = nLevel - m_Skills[nIndex].SkillLevel;
  118. IncreaseLevel(nIndex, nInc);
  119. return TRUE;
  120. }
  121. #endif
  122. BOOL KSkillList::IncreaseLevel(int nIdx, int nLvl)
  123. {
  124. if (nIdx <= 0 || nIdx >= MAX_NPCSKILL)
  125. return FALSE;
  126. if (nLvl <= 0)
  127. return FALSE;
  128. m_Skills[nIdx].SkillLevel += nLvl;
  129. m_Skills[nIdx].CurrentSkillLevel += nLvl;
  130. KSkill * pOrdinSkill = (KSkill *)g_SkillManager.GetSkill(m_Skills[nIdx].SkillId, m_Skills[nIdx].CurrentSkillLevel);
  131. if (!pOrdinSkill) 
  132.         return FALSE;
  133. if (pOrdinSkill->GetSkillStyle() == SKILL_SS_PassivityNpcState)
  134. {
  135. pOrdinSkill->Cast(m_nNpcIndex, -1, m_nNpcIndex);
  136. }
  137. return TRUE;
  138. }
  139. int KSkillList::Add(int nSkillID, int nLevel, int nMaxTimes, int RemainTimes)
  140. {
  141. int i;
  142. if (nSkillID <= 0 || nLevel < 0)
  143. return 0;
  144. i = FindSame(nSkillID);
  145. if (i)
  146. {
  147. if (nLevel > m_Skills[i].SkillLevel)
  148. {
  149. int nInc = nLevel - m_Skills[i].SkillLevel;
  150. IncreaseLevel(i, nInc);
  151. }
  152. m_Skills[i].MaxTimes = 0;
  153. m_Skills[i].RemainTimes = 0;
  154. if (nLevel  > 0)
  155. {
  156. ISkill * pSkill = g_SkillManager.GetSkill(nSkillID, m_Skills[i].CurrentSkillLevel);
  157. if (!pSkill) 
  158. return 0;
  159. //如果改技能属于被动辅助技能时,则设置Npc状态
  160. if (pSkill->GetSkillStyle() == SKILL_SS_PassivityNpcState)
  161. {
  162. ((KSkill *)pSkill)->Cast(m_nNpcIndex, -1, m_nNpcIndex);
  163. }
  164. }
  165. return i;
  166. }
  167. i = FindFree();
  168. if (i)
  169. {
  170. m_Skills[i].SkillId = nSkillID;
  171. m_Skills[i].SkillLevel = nLevel;
  172. m_Skills[i].CurrentSkillLevel = nLevel;
  173. m_Skills[i].MaxTimes = 0;
  174. m_Skills[i].RemainTimes = 0;
  175. if (nLevel > 0)
  176. {
  177. ISkill * pSkill =  g_SkillManager.GetSkill(nSkillID, nLevel);
  178. if (!pSkill) 
  179. return 0 ;
  180. if (pSkill->GetSkillStyle() == SKILL_SS_PassivityNpcState)
  181. {
  182. ((KSkill*)pSkill)->Cast(m_nNpcIndex, -1, m_nNpcIndex);
  183. }
  184. }
  185. return i;
  186. }
  187. return 0;
  188. }
  189. int KSkillList::GetLevel(int nSkillID)
  190. {
  191. int i;
  192. if (!nSkillID)
  193. return 0;
  194. i = FindSame(nSkillID);
  195. if (i)
  196. {
  197. _ASSERT(m_Skills[i].SkillLevel < MAX_SKILLLEVEL);
  198. return m_Skills[i].SkillLevel;
  199. }
  200. return 0;
  201. }
  202. int KSkillList::GetCurrentLevel(int nSkillID)
  203. {
  204. int i;
  205. if (!nSkillID)
  206. return 0;
  207. i = FindSame(nSkillID);
  208. if (i)
  209. {
  210. return m_Skills[i].CurrentSkillLevel;
  211. }
  212. return 0;
  213. }
  214. BOOL KSkillList::CanCast(int nSkillID, DWORD dwTime)
  215. {
  216. if (!nSkillID)
  217. return FALSE;
  218. int i = FindSame(nSkillID);
  219. if (!i)
  220. {
  221. return FALSE;
  222. }
  223. if (m_Skills[i].CurrentSkillLevel <= 0 || m_Skills[i].NextCastTime > dwTime)
  224. return FALSE;
  225. return TRUE;
  226. }
  227. void KSkillList::SetNextCastTime(int nSkillID, DWORD dwTime)
  228. {
  229. // m_Skills[nSkillID].NextCastTime = dwTime;
  230. // return;
  231. if (!nSkillID)
  232. return;;
  233. int i = FindSame(nSkillID);
  234. if (!i)
  235. return;
  236. m_Skills[i].NextCastTime = dwTime;
  237. }
  238. #ifndef _SERVER
  239. int KSkillList::GetSkillSortList(KUiSkillData * pSkillList)
  240. {
  241. //Ques
  242. if (!pSkillList) return 0;
  243. memset(pSkillList, 0, sizeof(KUiSkillData) * 50);
  244. int nCount = 0;
  245. ISkill* pSkill = NULL;
  246. KSkill * pOrdinSkill = NULL;
  247. for (int i = 1; i < MAX_NPCSKILL; i++)
  248. {
  249. if (m_Skills[i].SkillId)
  250. {
  251. _ASSERT(m_Skills[i].SkillLevel >= 0);
  252. if (!m_Skills[i].SkillLevel)
  253. {
  254. pSkill =  g_SkillManager.GetSkill(m_Skills[i].SkillId, 1);
  255. }
  256. else 
  257. {
  258. pSkill =  g_SkillManager.GetSkill(m_Skills[i].SkillId, m_Skills[i].SkillLevel);
  259. }
  260. if (!pSkill)
  261. continue;
  262. eSkillStyle eStyle = (eSkillStyle)pSkill->GetSkillStyle();
  263. switch(eStyle)
  264. {
  265. case SKILL_SS_Missles: // 子弹类 本技能用于发送子弹类
  266. case SKILL_SS_Melee:
  267. case SKILL_SS_InitiativeNpcState: // 主动类 本技能用于改变当前Npc的主动状态
  268. case SKILL_SS_PassivityNpcState: // 被动类 本技能用于改变Npc的被动状态
  269. {
  270. pOrdinSkill = (KSkill * ) pSkill;
  271. if (pOrdinSkill->IsPhysical())
  272. continue;
  273. }break;
  274. case SKILL_SS_Thief: // 偷窃类
  275. {
  276. }
  277. break;
  278. default:
  279. continue;
  280. }
  281.             KUiSkillData * pSkill = pSkillList + nCount;
  282. pSkill->uGenre = CGOG_SKILL_FIGHT;
  283. pSkill->uId = m_Skills[i].SkillId;
  284. pSkill->nLevel = m_Skills[i].SkillLevel;
  285. if ((++nCount) == 50)
  286. {
  287. g_DebugLog("Npc的技能数量超过了限制50!!!,请检查!!!");
  288. break;
  289. }
  290. }
  291. }
  292. return nCount;
  293. }
  294. int KSkillList::GetLeftSkillSortList(KUiSkillData* pSkillList)
  295. {
  296. if (!pSkillList) return 0;
  297. memset(pSkillList, 0, sizeof(KUiSkillData) * 65);
  298. int nCount = 1;
  299. pSkillList->uGenre = CGOG_SKILL_SHORTCUT;
  300. pSkillList->uId = Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].GetCurActiveWeaponSkill();//物理技能置前!
  301. pSkillList->nData = 0;
  302. ISkill * pISkill = NULL;
  303. KSkill * pOrdinSkill = NULL;
  304. for (int i = 1; i < MAX_NPCSKILL; i++)
  305. {
  306. if (m_Skills[i].SkillId && m_Skills[i].SkillLevel > 0)
  307. {
  308. _ASSERT(m_Skills[i].SkillId > 0);
  309. pISkill = g_SkillManager.GetSkill(m_Skills[i].SkillId, m_Skills[i].SkillLevel);
  310. if (!pISkill)
  311. continue;
  312. eSkillStyle eStyle = (eSkillStyle)pISkill->GetSkillStyle();
  313. switch(eStyle)
  314. {
  315. case SKILL_SS_Missles: // 子弹类 本技能用于发送子弹类
  316. case SKILL_SS_Melee:
  317. case SKILL_SS_InitiativeNpcState: // 主动类 本技能用于改变当前Npc的主动状态
  318. case SKILL_SS_PassivityNpcState: // 被动类 本技能用于改变Npc的被动状态
  319. {
  320. pOrdinSkill = (KSkill * ) pISkill;
  321. if ((!pOrdinSkill->IsPhysical()) &&
  322. (pOrdinSkill->GetSkillLRInfo() == BothSkill) || 
  323. (pOrdinSkill->GetSkillLRInfo() == leftOnlySkill)
  324. )
  325. {
  326. }
  327. else 
  328. continue;
  329. }
  330. break;
  331. case SKILL_SS_Thief:
  332. {
  333. continue;
  334. }break;
  335. }
  336. KUiSkillData * pSkill = pSkillList + nCount;
  337. pSkill->uGenre = CGOG_SKILL_SHORTCUT;
  338. pSkill->uId = m_Skills[i].SkillId;
  339. pSkill->nData = nCount / 8;
  340. nCount ++;
  341. if (nCount >= 65)
  342. break;
  343. }
  344. }
  345. return nCount;
  346. }
  347. int KSkillList::GetRightSkillSortList(KUiSkillData* pSkillList)
  348. {
  349. if (!pSkillList) return 0;
  350. memset(pSkillList, 0, sizeof(KUiSkillData) * 65);
  351. int nCount = 1;
  352. pSkillList->uGenre = CGOG_SKILL_SHORTCUT;
  353. //pSkillList->uId = (unsigned int)-1;//物理技能置前!
  354. pSkillList->uId = Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].GetCurActiveWeaponSkill();//物理技能置前!;  
  355. pSkillList->nData = 0;
  356. ISkill * pISkill = NULL;
  357. KSkill * pOrdinSkill = NULL;
  358. for (int i = 1; i < MAX_NPCSKILL; i++)
  359. {
  360. if (m_Skills[i].SkillId && m_Skills[i].SkillLevel > 0)
  361. {
  362. _ASSERT(m_Skills[i].SkillId > 0);
  363. pISkill  =  g_SkillManager.GetSkill(m_Skills[i].SkillId, m_Skills[i].SkillLevel);
  364. if(!pISkill)
  365. continue;
  366. eSkillStyle eStyle = ( eSkillStyle ) pISkill->GetSkillStyle();
  367. switch(eStyle)
  368. {
  369. case SKILL_SS_Missles: // 子弹类 本技能用于发送子弹类
  370. case SKILL_SS_Melee:
  371. case SKILL_SS_InitiativeNpcState: // 主动类 本技能用于改变当前Npc的主动状态
  372. case SKILL_SS_PassivityNpcState: // 被动类 本技能用于改变Npc的被动状态
  373. {
  374. pOrdinSkill = (KSkill * ) pISkill;
  375. if (
  376. (!pOrdinSkill->IsPhysical()) && 
  377. (pOrdinSkill->GetSkillLRInfo() == BothSkill) || 
  378. (pOrdinSkill->GetSkillLRInfo() == RightOnlySkill)
  379. )
  380. {
  381. }
  382. else 
  383. continue;
  384. }
  385. break;
  386. case SKILL_SS_Thief:
  387. {
  388. }break;
  389. }
  390. KUiSkillData * pSkill = pSkillList + nCount;
  391. pSkill->uGenre = CGOG_SKILL_SHORTCUT;
  392. pSkill->uId = m_Skills[i].SkillId;
  393. pSkill->nData = nCount / 8;
  394. nCount ++;
  395. if (nCount >= 65)
  396. break;
  397. }
  398. }
  399. return nCount;
  400. }
  401. int KSkillList::GetSkillPosition(int nSkillId)//获得技能在技能界面的位置
  402. {
  403. if (nSkillId <= 0) return -1;
  404. KSkill * pOrdinSkill = NULL;
  405. ISkill * pISkill = NULL;
  406. int nCount = 0;
  407. for (int i = 1; i < MAX_NPCSKILL; i++)
  408. {
  409. _ASSERT(m_Skills[i].SkillLevel >= 0);
  410. if (m_Skills[i].SkillId<= 0) continue;
  411. if (m_Skills[i].SkillLevel == 0)
  412. {
  413. pISkill = g_SkillManager.GetSkill(m_Skills[i].SkillId, 1);
  414. }
  415. else
  416. {
  417. pISkill =  g_SkillManager.GetSkill(m_Skills[i].SkillId, m_Skills[i].SkillLevel);
  418. }
  419. if (!pISkill) 
  420.          continue ;
  421. eSkillStyle eStyle = ( eSkillStyle ) pISkill->GetSkillStyle();
  422. switch(eStyle)
  423. {
  424. case SKILL_SS_Missles: // 子弹类 本技能用于发送子弹类
  425. case SKILL_SS_Melee:
  426. case SKILL_SS_InitiativeNpcState: // 主动类 本技能用于改变当前Npc的主动状态
  427. case SKILL_SS_PassivityNpcState: // 被动类 本技能用于改变Npc的被动状态
  428. {
  429. pOrdinSkill = (KSkill * ) pISkill;
  430. if (
  431. (!m_Skills[i].SkillId) || 
  432. (pOrdinSkill->IsPhysical())
  433. )
  434. {
  435. continue;
  436. }
  437. }
  438. break;
  439. case SKILL_SS_Thief:
  440. {
  441. }break;
  442. }
  443. if (m_Skills[i].SkillId == nSkillId)
  444. {
  445. return nCount;
  446. }
  447. nCount ++;
  448. }
  449. return nCount;
  450. }
  451. #endif
  452. #ifdef _SERVER
  453. int KSkillList::UpdateDBSkillList(BYTE * pSkillBuffer)
  454. {
  455. if (!pSkillBuffer)
  456. return -1;
  457. int nCount = 0;
  458. TDBSkillData * pSkillData = (TDBSkillData *) pSkillBuffer;
  459. for (int i = 0 ; i < MAX_NPCSKILL; i ++)
  460. {
  461. if (m_Skills[i].SkillId > 0)
  462. {
  463. pSkillData->m_nSkillId = m_Skills[i].SkillId;
  464. pSkillData->m_nSkillLevel = m_Skills[i].SkillLevel;
  465. pSkillData++;
  466. nCount ++;
  467. }
  468. }
  469. return nCount;
  470. }
  471. int KSkillList::ClearSkillLevel(bool bClearPhysicalLevel)
  472. {
  473. int nTotalSkillPoint = 0;
  474. for (int i = 0 ; i < MAX_NPCSKILL; i ++)
  475. {
  476. if (m_Skills[i].SkillId > 0)
  477. {
  478. ISkill * pSkill = g_SkillManager.GetSkill(m_Skills[i].SkillId, 1);
  479. if (pSkill)
  480. {
  481. if (pSkill->IsPhysical())
  482. continue;
  483. nTotalSkillPoint += m_Skills[i].SkillLevel;
  484. m_Skills[i].SkillLevel = 0;
  485. m_Skills[i].CurrentSkillLevel = 0;
  486. }
  487. }
  488. }
  489. return nTotalSkillPoint;
  490. }
  491. #endif