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

模拟服务器

开发平台:

C/C++

  1. // KTongSet.cpp: implementation of the CTongSet class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Global.h"
  6. #include "TongDB.h"
  7. #include "KTongSet.h"
  8. //////////////////////////////////////////////////////////////////////
  9. // Construction/Destruction
  10. //////////////////////////////////////////////////////////////////////
  11. CTongSet::CTongSet()
  12. {
  13. m_pcTong = NULL;
  14. m_nTongPointSize = 0;
  15. Init();
  16. }
  17. CTongSet::~CTongSet()
  18. {
  19. DeleteAll();
  20. }
  21. void CTongSet::Init()
  22. {
  23. DeleteAll();
  24. m_pcTong = (CTongControl**)new LPVOID[defTONG_SET_INIT_POINT_NUM];
  25. m_nTongPointSize = defTONG_SET_INIT_POINT_NUM;
  26. for (int i = 0; i < m_nTongPointSize; i++)
  27. {
  28. m_pcTong[i] = NULL;
  29. }
  30. }
  31. void CTongSet::DeleteAll()
  32. {
  33. if (m_pcTong)
  34. {
  35. for (int i = 0; i < m_nTongPointSize; i++)
  36. {
  37. if (m_pcTong[i])
  38. {
  39. delete m_pcTong[i];
  40. m_pcTong[i] = NULL;
  41. }
  42. }
  43. delete []m_pcTong;
  44. m_pcTong = NULL;
  45. }
  46. m_nTongPointSize = 0;
  47. }
  48. int CTongSet::Create(int nCamp, char *lpszPlayerName, char *lpszTongName)
  49. {
  50. // 帮会模块出错
  51. if (!m_pcTong || m_nTongPointSize <= 0)
  52. return enumTONG_CREATE_ERROR_ID10;
  53. // 名字字符串出错
  54. if (!lpszPlayerName || !lpszTongName)
  55. return enumTONG_CREATE_ERROR_ID11;
  56. // 名字字符串过长
  57. if (strlen(lpszTongName) >= defTONG_STR_LENGTH ||
  58. strlen(lpszPlayerName) >= defTONG_STR_LENGTH)
  59. return enumTONG_CREATE_ERROR_ID12;
  60. int i, nPos;
  61. DWORD dwTongNameID, dwPlayerNameID;
  62. dwTongNameID = g_String2Id(lpszTongName);
  63. dwPlayerNameID = g_String2Id(lpszPlayerName);
  64. // 名称检测,是否有同名的帮主或者同名的帮会
  65. for (i = 0; i < m_nTongPointSize; i++)
  66. {
  67. if (m_pcTong[i] && (m_pcTong[i]->m_dwNameID == dwTongNameID || m_pcTong[i]->m_dwMasterID == dwPlayerNameID))
  68. break;
  69. }
  70. // 帮会同名错误
  71. if (i < m_nTongPointSize)
  72. return enumTONG_CREATE_ERROR_ID13;
  73. // 查找空位
  74. nPos = -1;
  75. for (i = 0; i < m_nTongPointSize; i++)
  76. {
  77. if (!m_pcTong[i])
  78. {
  79. nPos = i;
  80. break;
  81. }
  82. }
  83. // 现有指针空间已满,分配新的更大的指针空间
  84. if (nPos < 0)
  85. {
  86. // 临时存储旧的指针
  87. CTongControl** pTemp;
  88. pTemp = (CTongControl**)new LPVOID[m_nTongPointSize];
  89. for (i = 0; i < m_nTongPointSize; i++)
  90. pTemp[i] = m_pcTong[i];
  91. // 分配新的更大的指针空间,大小是原来的两倍
  92. delete []m_pcTong;
  93. m_pcTong = NULL;
  94. m_pcTong = (CTongControl**)new LPVOID[m_nTongPointSize * 2];
  95. for (i = 0; i < m_nTongPointSize; i++)
  96. m_pcTong[i] = pTemp[i];
  97. delete []pTemp;
  98. m_nTongPointSize *= 2;
  99. for (i = m_nTongPointSize / 2; i < m_nTongPointSize; i++)
  100. m_pcTong[i] = NULL;
  101. nPos = m_nTongPointSize / 2;
  102. }
  103. // 产生一个新的帮会
  104. m_pcTong[nPos] = new CTongControl(nCamp, lpszPlayerName, lpszTongName);
  105. // 产生失败
  106. if (m_pcTong[nPos]->m_dwNameID == 0)
  107. {
  108. delete m_pcTong[nPos];
  109. m_pcTong[nPos] = NULL;
  110. return enumTONG_CREATE_ERROR_ID14;
  111. }
  112. // 存盘,数据保存至数据库
  113. TMemberStruct sMember;
  114. sMember.MemberClass = enumTONG_FIGURE_MASTER;
  115. sMember.nTitleIndex = 0;
  116. strcpy(sMember.szTong, m_pcTong[nPos]->m_szName);
  117. strcpy(sMember.szName, m_pcTong[nPos]->m_szMasterName);
  118. g_cTongDB.ChangeTong(*m_pcTong[nPos]);
  119. g_cTongDB.ChangeMember(sMember);
  120. return 0;
  121. }
  122. //----------------------------------------------------------------------
  123. // 功能:添加一个帮会成员,if return == 0 成功 else return error id
  124. //----------------------------------------------------------------------
  125. int CTongSet::AddMember(char *lpszPlayerName, char *lpszTongName)
  126. {
  127. if (!m_pcTong || m_nTongPointSize <= 0)
  128. return -1;
  129. if (!lpszPlayerName || !lpszPlayerName[0] || !lpszTongName || !lpszTongName[0])
  130. return -1;
  131. if (strlen(lpszTongName) >= defTONG_STR_LENGTH ||
  132. strlen(lpszPlayerName) >= defTONG_STR_LENGTH)
  133. return -1;
  134. int i;
  135. DWORD dwTongNameID;
  136. dwTongNameID = g_String2Id(lpszTongName);
  137. // 寻找帮会
  138. for (i = 0; i < m_nTongPointSize; i++)
  139. {
  140. // 找到了
  141. if (m_pcTong[i] && (m_pcTong[i]->m_dwNameID == dwTongNameID))
  142. {
  143. if (!m_pcTong[i]->AddMember(lpszPlayerName))
  144. return -1;
  145. else
  146. {
  147. // 存盘,数据保存至数据库
  148. TMemberStruct sMember;
  149. sMember.MemberClass = enumTONG_FIGURE_MEMBER;
  150. sMember.nTitleIndex = 0;
  151. strcpy(sMember.szTong, m_pcTong[i]->m_szName);
  152. strcpy(sMember.szName, lpszPlayerName);
  153. g_cTongDB.ChangeMember(sMember);
  154. // 给帮会频道发消息
  155. char szMsg[96];
  156. sprintf(szMsg, "\O%u", m_pcTong[i]->m_dwNameID);
  157. DWORD channid = g_ChannelMgr.GetChannelID(szMsg, 0);
  158. if (channid != -1)
  159. {
  160. sprintf(szMsg, "%s加入本帮!", lpszPlayerName);
  161. g_ChannelMgr.SayOnChannel(channid, TRUE, std::string(), std::string("公告"), std::string(szMsg));
  162. }
  163. return i;
  164. }
  165. }
  166. }
  167. return -1;
  168. }
  169. //----------------------------------------------------------------------
  170. // 功能:获得帮会阵营
  171. //----------------------------------------------------------------------
  172. int CTongSet::GetTongCamp(int nTongIdx)
  173. {
  174. if (!m_pcTong || m_nTongPointSize <= 0)
  175. return -1;
  176. if (nTongIdx < 0 || nTongIdx >= m_nTongPointSize)
  177. return -1;
  178. if (m_pcTong[nTongIdx])
  179. return m_pcTong[nTongIdx]->m_nCamp;
  180. return -1;
  181. }
  182. BOOL CTongSet::GetMasterName(int nTongIdx, char *lpszName)
  183. {
  184. if (!lpszName)
  185. return FALSE;
  186. if (!m_pcTong || m_nTongPointSize <= 0)
  187. return FALSE;
  188. if (nTongIdx < 0 || nTongIdx >= m_nTongPointSize)
  189. return FALSE;
  190. if (!m_pcTong[nTongIdx])
  191. return FALSE;
  192. strcpy(lpszName, m_pcTong[nTongIdx]->m_szMasterName);
  193. return TRUE;
  194. }
  195. BOOL CTongSet::GetMemberTitle(int nTongIdx, char *lpszTitle)
  196. {
  197. if (!lpszTitle)
  198. return FALSE;
  199. if (!m_pcTong || m_nTongPointSize <= 0)
  200. return FALSE;
  201. if (nTongIdx < 0 || nTongIdx >= m_nTongPointSize)
  202. return FALSE;
  203. if (!m_pcTong[nTongIdx])
  204. return FALSE;
  205. strcpy(lpszTitle, m_pcTong[nTongIdx]->m_szNormalTitle);
  206. return TRUE;
  207. }
  208. BOOL CTongSet::GetTongHeadInfo(DWORD dwTongNameID, STONG_HEAD_INFO_SYNC *pInfo)
  209. {
  210. if (!m_pcTong || m_nTongPointSize <= 0 || dwTongNameID == 0)
  211. return FALSE;
  212. // 寻找帮会
  213. for (int i = 0; i < m_nTongPointSize; i++)
  214. {
  215. if (m_pcTong[i] && m_pcTong[i]->m_dwNameID == dwTongNameID)
  216. {
  217. return m_pcTong[i]->GetTongHeadInfo(pInfo);
  218. }
  219. }
  220. return FALSE;
  221. }
  222. BOOL CTongSet::GetTongManagerInfo(STONG_GET_MANAGER_INFO_COMMAND *pApply, STONG_MANAGER_INFO_SYNC *pInfo)
  223. {
  224. if (!pApply || !pInfo)
  225. return FALSE;
  226. if (!m_pcTong)
  227. return FALSE;
  228. // 寻找帮会
  229. for (int i = 0; i < m_nTongPointSize; i++)
  230. {
  231. if (m_pcTong[i] && m_pcTong[i]->m_dwNameID == (DWORD)pApply->m_nParam1)
  232. {
  233. return m_pcTong[i]->GetTongManagerInfo(pApply, pInfo);
  234. }
  235. }
  236. return FALSE;
  237. }
  238. BOOL CTongSet::GetTongMemberInfo(STONG_GET_MEMBER_INFO_COMMAND *pApply, STONG_MEMBER_INFO_SYNC *pInfo)
  239. {
  240. if (!pApply || !pInfo)
  241. return FALSE;
  242. if (!m_pcTong)
  243. return FALSE;
  244. // 寻找帮会
  245. for (int i = 0; i < m_nTongPointSize; i++)
  246. {
  247. if (m_pcTong[i] && m_pcTong[i]->m_dwNameID == (DWORD)pApply->m_nParam1)
  248. {
  249. return m_pcTong[i]->GetTongMemberInfo(pApply, pInfo);
  250. }
  251. }
  252. return FALSE;
  253. }
  254. BOOL CTongSet::Instate(STONG_INSTATE_COMMAND *pInstate, STONG_INSTATE_SYNC *pSync)
  255. {
  256. if (!pInstate || !pSync)
  257. return FALSE;
  258. if (!m_pcTong)
  259. return FALSE;
  260. // 寻找帮会
  261. for (int i = 0; i < m_nTongPointSize; i++)
  262. {
  263. if (m_pcTong[i] && m_pcTong[i]->m_dwNameID == pInstate->m_dwTongNameID)
  264. {
  265. return m_pcTong[i]->Instate(pInstate, pSync);
  266. }
  267. }
  268. return FALSE;
  269. }
  270. BOOL CTongSet::Kick(STONG_KICK_COMMAND *pKick, STONG_KICK_SYNC *pSync)
  271. {
  272. if (!pKick || !pSync)
  273. return FALSE;
  274. if (!m_pcTong)
  275. return FALSE;
  276. // 寻找帮会
  277. for (int i = 0; i < m_nTongPointSize; i++)
  278. {
  279. if (m_pcTong[i] && m_pcTong[i]->m_dwNameID == pKick->m_dwTongNameID)
  280. {
  281. return m_pcTong[i]->Kick(pKick, pSync);
  282. }
  283. }
  284. return FALSE;
  285. }
  286. BOOL CTongSet::Leave(STONG_LEAVE_COMMAND *pLeave, STONG_LEAVE_SYNC *pSync)
  287. {
  288. if (!pLeave || !pSync)
  289. return FALSE;
  290. if (!m_pcTong)
  291. return FALSE;
  292. // 寻找帮会
  293. for (int i = 0; i < m_nTongPointSize; i++)
  294. {
  295. if (m_pcTong[i] && m_pcTong[i]->m_dwNameID == pLeave->m_dwTongNameID)
  296. {
  297. return m_pcTong[i]->Leave(pLeave, pSync);
  298. }
  299. }
  300. return FALSE;
  301. }
  302. BOOL CTongSet::AcceptMaster(STONG_ACCEPT_MASTER_COMMAND *pAccept)
  303. {
  304. if (!pAccept)
  305. return FALSE;
  306. if (!m_pcTong)
  307. return FALSE;
  308. // 寻找帮会
  309. for (int i = 0; i < m_nTongPointSize; i++)
  310. {
  311. if (m_pcTong[i] && m_pcTong[i]->m_dwNameID == pAccept->m_dwTongNameID)
  312. {
  313. return m_pcTong[i]->AcceptMaster(pAccept);
  314. }
  315. }
  316. return FALSE;
  317. }
  318. BOOL CTongSet::InitFromDB()
  319. {
  320. int nTongNum;
  321. nTongNum = g_cTongDB.GetTongCount();
  322. if (nTongNum < 0)
  323. return FALSE;
  324. if (nTongNum == 0)
  325. return TRUE;
  326. if (nTongNum > m_nTongPointSize)
  327. {
  328. DeleteAll();
  329. m_pcTong = (CTongControl**)new LPVOID[nTongNum + defTONG_SET_INIT_POINT_NUM];
  330. m_nTongPointSize = nTongNum + defTONG_SET_INIT_POINT_NUM;
  331. for (int i = 0; i < m_nTongPointSize; i++)
  332. {
  333. m_pcTong[i] = NULL;
  334. }
  335. }
  336. int i;
  337. TTongList *pList = new TTongList[nTongNum];
  338. memset(pList, 0, sizeof(TTongList) * nTongNum);
  339. int nGetNum = g_cTongDB.GetTongList(pList, nTongNum);
  340. if (nGetNum <= 0)
  341. return TRUE;
  342. for (i = 0; i < nGetNum; i++)
  343. {
  344. m_pcTong[i] = new CTongControl(pList[i]);
  345. if (!m_pcTong[i]->m_szName[0])
  346. {
  347. delete m_pcTong[i];
  348. m_pcTong[i] = NULL;
  349. }
  350. }
  351. for (i = 0; i < nGetNum; i++)
  352. {
  353. if (m_pcTong[i] && m_pcTong[i]->m_szName[0])
  354. g_cTongDB.SearchTong(m_pcTong[i]->m_szName, *(m_pcTong[i]));
  355. }
  356. if (pList)
  357. {
  358. delete []pList;
  359. }
  360. return TRUE;
  361. }
  362. BOOL CTongSet::GetLoginData(STONG_GET_LOGIN_DATA_COMMAND *pLogin, STONG_LOGIN_DATA_SYNC *pSync)
  363. {
  364. if (!pLogin || !pSync)
  365. return FALSE;
  366. memset(pSync, 0, sizeof(STONG_LOGIN_DATA_SYNC));
  367. pSync->ProtocolFamily = pf_tong;
  368. pSync->ProtocolID = enumS2C_TONG_LOGIN_DATA;
  369. pSync->m_btFlag = 0;
  370. pSync->m_dwParam = pLogin->m_dwParam;
  371. if (!m_pcTong)
  372. return FALSE;
  373. // 寻找帮会
  374. for (int i = 0; i < m_nTongPointSize; i++)
  375. {
  376. if (m_pcTong[i] && m_pcTong[i]->m_dwNameID == pLogin->m_dwTongNameID)
  377. {
  378. return m_pcTong[i]->GetLoginData(pLogin, pSync);
  379. }
  380. }
  381. return TRUE;
  382. }
  383. BOOL CTongSet::SearchOne(DWORD dwTongNameID, char *lpszName, STONG_ONE_LEADER_INFO *pInfo)
  384. {
  385. if (!m_pcTong)
  386. return FALSE;
  387. if (dwTongNameID == 0 || !lpszName || !lpszName[0] || !pInfo)
  388. return FALSE;
  389. for (int i = 0; i < m_nTongPointSize; i++)
  390. {
  391. if (m_pcTong[i] && m_pcTong[i]->m_dwNameID == dwTongNameID)
  392. {
  393. return m_pcTong[i]->SearchOne(lpszName, pInfo);
  394. }
  395. }
  396. return FALSE;
  397. }