PageRenderTime 26ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/branches/Game1/SERVER/WorldServer/AppWorld/Linkman/LeaveWordSystem.cpp

http://mmo-resourse.googlecode.com/
C++ | 318 lines | 228 code | 52 blank | 38 comment | 48 complexity | b478dd473a9d8083e48e8cafc5790157 MD5 | raw file
Possible License(s): Zlib, LGPL-2.1, LGPL-2.0
  1. #include "StdAfx.h"
  2. #include "LeaveWordSystem.h"
  3. #include "LinkmanSystem.h"
  4. #include "..\nets\networld\message.h"
  5. LeaveWordSystem::LeaveWordSystem(void)
  6. :m_pTimerQueue(NULL),
  7. m_BufIdSeed(0)
  8. {
  9. memset(&m_LeaveWordSetup, 0xff, sizeof(tagLeaveWordSetup));
  10. }
  11. LeaveWordSystem::~LeaveWordSystem(void)
  12. {
  13. Release();
  14. }
  15. LeaveWordSystem g_LeaveWordSystem;
  16. LeaveWordSystem& LeaveWordSystem::GetInstance(void)
  17. {
  18. return g_LeaveWordSystem;
  19. }
  20. ////////////////////////////////////////////////////////////////////////////////////////////////////
  21. //! ???
  22. BOOL LeaveWordSystem::Init(const char *pSetupFile)
  23. {
  24. if (!LoadSetup(pSetupFile))
  25. {
  26. AddLogText("???????????????????");
  27. return FALSE;
  28. }
  29. if (!StartupTimer())
  30. {
  31. AddLogText("???????????????????");
  32. return FALSE;
  33. }
  34. //! ?????
  35. GetGame()->GetMemPool().SetInitialTileNum(sizeof(tagLeaveWord_W2DB), 128);
  36. return TRUE;
  37. }
  38. //! ?????DBS
  39. void LeaveWordSystem::SendSetupToDBS(void)
  40. {
  41. CMessage msg(MSG_W2DB_LEAVEWORD_SETUP);
  42. msg.AddEx(&m_LeaveWordSetup, sizeof(tagLeaveWordSetup));
  43. msg.SendToSocket(GetGame()->GetDBSocketID());
  44. }
  45. //! ??
  46. void LeaveWordSystem::Release(void)
  47. {
  48. if (NULL != m_pTimerQueue)
  49. {
  50. //! ??????
  51. m_pTimerQueue->Cancel(this);
  52. //! ????
  53. SAFE_DELETE(m_pTimerQueue);
  54. //! ????????m_LeaveWriteBuf???
  55. for (map<LONG, tagLeaveWord_W2DB*>::iterator ite = m_LeaveWriteBuf.begin(); ite != m_LeaveWriteBuf.end(); ++ite)
  56. {
  57. ReleaseWord_W2DB(ite->second);
  58. ite->second = NULL;
  59. }
  60. m_LeaveWriteBuf.clear();
  61. }
  62. }
  63. //! ????
  64. BOOL LeaveWordSystem::LeaveWord(const CGUID &SenderGuid, const char *pReceiverName, char *pWord)
  65. {
  66. CPlayer *pSender = GetGame()->GetMapPlayer(SenderGuid);
  67. if (NULL == pSender)return FALSE;
  68. map<CGUID, LONG>::iterator ite = m_PlayerLvwdCount.find(SenderGuid);
  69. if (m_PlayerLvwdCount.end() != ite)
  70. {
  71. if(m_LeaveWordSetup.lMaxLeaveWordNum <= ite->second)
  72. {
  73. //! ????
  74. CMessage msg(MSG_W2S_LEAVEWORD_SAVE_RESULT);
  75. msg.Add((LONG)eLWR_SendMore);
  76. msg.Add(pReceiverName);
  77. msg.Add(SenderGuid);
  78. msg.SendToSocket(pSender->GetGsSocket());
  79. return FALSE;
  80. }
  81. }
  82. //! ???????????GUID
  83. CGUID ReceiverGuid;
  84. ULONG uPRI = LinkmanSystem::GetInstance().CanLeaveWord(SenderGuid, pReceiverName, ReceiverGuid);
  85. if (eLWPRI_Cant == uPRI)
  86. {
  87. RePlayerSendFailed(pSender, pReceiverName);
  88. return FALSE;
  89. }
  90. assert(NULL_GUID != ReceiverGuid);
  91. if (NULL_GUID == ReceiverGuid) return FALSE;
  92. tagLeaveWord_W2DB* pLeaveWord_W2DB = CreateLeaveWord_W2DB();
  93. pLeaveWord_W2DB->dwSenderType = eSender_Player;
  94. pLeaveWord_W2DB->ReceiverGuid = ReceiverGuid;
  95. pLeaveWord_W2DB->SenderGuid = SenderGuid;
  96. pLeaveWord_W2DB->uPRI = uPRI;
  97. strcpy(pLeaveWord_W2DB->szSenderName, pSender->GetName());
  98. LONG lBufID = GetBufID();
  99. CMessage msg(MSG_W2DB_LEAVEWORD_SAVE);
  100. msg.Add(lBufID);
  101. msg.AddEx(pLeaveWord_W2DB, sizeof(tagLeaveWord_W2DB));
  102. msg.Add(pWord);
  103. msg.SendToSocket(GetGame()->GetDBSocketID());
  104. assert(m_LeaveWriteBuf.end() == m_LeaveWriteBuf.find(lBufID));
  105. strcpy(pLeaveWord_W2DB->szReceiverName, pReceiverName);
  106. m_LeaveWriteBuf[lBufID] = pLeaveWord_W2DB;
  107. return TRUE;
  108. }
  109. //! ??????
  110. void LeaveWordSystem::OnPlayerLogin(CPlayer *pReceiver)
  111. {
  112. if(m_WaitPlayerGuid.find(pReceiver->GetExID()) == m_WaitPlayerGuid.end())
  113. {
  114. m_WaitPlayerGuid.insert(pReceiver->GetExID());
  115. CMessage msg(MSG_W2DB_LEAVEWORD_POP);
  116. msg.Add(pReceiver->GetExID());
  117. msg.SendToSocket(GetGame()->GetDBSocketID());
  118. }
  119. }
  120. //! ????????
  121. void LeaveWordSystem::OnLeaveWordPop(CMessage *pMsg)
  122. {
  123. CGUID PlayerGuid;
  124. pMsg->GetGUID(PlayerGuid);
  125. LONG lDataSize = pMsg->GetLong();
  126. CPlayer *pPlayer = GetGame()->GetMapPlayer(PlayerGuid);
  127. if (NULL != pPlayer && sizeof(LONG) < lDataSize)
  128. {
  129. pMsg->SetType(MSG_W2S_LEAVEWORD_POP);
  130. pMsg->SendToSocket(pPlayer->GetGsSocket());
  131. }
  132. m_WaitPlayerGuid.erase(PlayerGuid);
  133. }
  134. //! ????????
  135. void LeaveWordSystem::OnLeaveWordResult(CMessage *pMsg)
  136. {
  137. LONG lBufID = pMsg->GetLong();
  138. LONG lResult = pMsg->GetLong();
  139. map<LONG, tagLeaveWord_W2DB*>::iterator ite = m_LeaveWriteBuf.find(lBufID);
  140. assert(ite != m_LeaveWriteBuf.end());
  141. if (ite == m_LeaveWriteBuf.end())return;
  142. tagLeaveWord_W2DB* pLeaveWord_W2DB = ite->second;
  143. m_LeaveWriteBuf.erase(lBufID);
  144. CPlayer *pSender = GetGame()->GetMapPlayer(pLeaveWord_W2DB->SenderGuid);
  145. if (NULL != pSender)
  146. {
  147. const CGUID &SenderGuid = pSender->GetExID();
  148. //! ????
  149. CMessage msg(MSG_W2S_LEAVEWORD_SAVE_RESULT);
  150. msg.Add(lResult);
  151. msg.Add(pLeaveWord_W2DB->szReceiverName);
  152. msg.Add(SenderGuid);
  153. msg.SendToSocket(pSender->GetGsSocket());
  154. //! ??????
  155. if (m_PlayerLvwdCount.end() == m_PlayerLvwdCount.find(SenderGuid))
  156. {
  157. m_PlayerLvwdCount[SenderGuid] = 1;
  158. }
  159. else
  160. {
  161. m_PlayerLvwdCount[SenderGuid] += 1;
  162. }
  163. }
  164. ReleaseWord_W2DB(pLeaveWord_W2DB);
  165. }
  166. //! ???????
  167. long LeaveWordSystem::OnTimeOut(DWORD timerid,DWORD curtime,const void* var)
  168. {
  169. m_PlayerLvwdCount.clear();
  170. CMessage msg(MSG_W2DB_LEAVEWORD_CLEAR_OUTTIME);
  171. msg.SendToSocket(GetGame()->GetDBSocketID());
  172. return 0;
  173. }
  174. //! ??????????
  175. void LeaveWordSystem::OnTimerCancel(DWORD timerid,const void* var)
  176. {
  177. }
  178. //! ???????
  179. void LeaveWordSystem::TimerExpire(LONG lCurrTime)
  180. {
  181. if(NULL != m_pTimerQueue)
  182. m_pTimerQueue->Expire(lCurrTime);
  183. }
  184. //! private
  185. ////////////////////////////////////////////////////////////////////////////////////////////////////
  186. //! ????
  187. BOOL LeaveWordSystem::LoadSetup(const char *pSetupFile)
  188. {
  189. if (NULL == pSetupFile)return FALSE;
  190. //! ?????
  191. TiXmlNode *pNode = NULL;
  192. CRFile *prfile = rfOpen(pSetupFile);
  193. if(NULL == prfile)
  194. {
  195. //??????
  196. return FALSE;
  197. }
  198. TiXmlDocument m_Tdoc(pSetupFile);
  199. //????????
  200. if( !m_Tdoc.LoadData(prfile->GetData(),prfile->GetDatalen()) )
  201. {
  202. //??????
  203. rfClose(prfile);
  204. return FALSE;
  205. }
  206. rfClose(prfile);
  207. pNode=m_Tdoc.FirstChild("LeaveWordSetup");
  208. if (pNode==NULL) return FALSE;
  209. TiXmlElement* pLeaveWordSetup = pNode->ToElement();//??node ???
  210. if (pLeaveWordSetup==NULL) return FALSE;
  211. const char *pValue = NULL;
  212. //! ????????????
  213. if(NULL == (pValue = pLeaveWordSetup->Attribute("MaxLeaveWordNum"))) return FALSE;
  214. m_LeaveWordSetup.lMaxLeaveWordNum = atoi(pValue);
  215. //! ????(?????????)
  216. if(NULL == (pValue = pLeaveWordSetup->Attribute("OptPeriodOfTime"))) return FALSE;
  217. m_LeaveWordSetup.lOptPeriodOfTime = 60 * atoi(pValue);
  218. //! ????????????
  219. if(NULL == (pValue = pLeaveWordSetup->Attribute("MaxToPlayerLeaveWordNum"))) return FALSE;
  220. m_LeaveWordSetup.lMaxToPlayerLeaveWordNum = atoi(pValue);
  221. //! ???????
  222. if(NULL == (pValue = pLeaveWordSetup->Attribute("MaxSaveLeaveWordNum"))) return FALSE;
  223. m_LeaveWordSetup.lMaxSaveLeaveWordNum = atoi(pValue);
  224. //! ??????????????????
  225. if(NULL == (pValue = pLeaveWordSetup->Attribute("MaxSaveTime"))) return FALSE;
  226. m_LeaveWordSetup.lMaxSaveTime = 60 * 60 * atoi(pValue);
  227. return TRUE;
  228. }
  229. //! ???????
  230. BOOL LeaveWordSystem::StartupTimer(void)
  231. {
  232. //! ????????4?????????
  233. m_pTimerQueue = new CTimerQueue<LeaveWordSystem*>(4, 1000 * 60);
  234. //! ????????????2????????????
  235. m_pTimerQueue->Schedule(this, NULL, 2 * 60 * 1000, m_LeaveWordSetup.lOptPeriodOfTime * 1000);
  236. return TRUE;
  237. }
  238. //! ??????????
  239. void LeaveWordSystem::RePlayerSendFailed(CPlayer *pSender, const char *pReceiverName)
  240. {
  241. CMessage msg(MSG_W2S_OTHER_TALK);
  242. msg.Add((BYTE)9); // ??
  243. msg.Add((LONG)CHAT_PRIVATE);
  244. msg.Add(pSender->GetType());
  245. msg.Add(pSender->GetExID());
  246. msg.Add(0L);
  247. msg.Add(pReceiverName);
  248. msg.SendToSocket(pSender->GetGsSocket());
  249. }
  250. //! ???????ID
  251. LONG LeaveWordSystem::GetBufID(void)
  252. {
  253. return ++m_BufIdSeed;
  254. }
  255. //! ??WSDB??
  256. tagLeaveWord_W2DB* LeaveWordSystem::CreateLeaveWord_W2DB(void)
  257. {
  258. void* pRe = GetGame()->GetMemPool().Multi_Alloc(sizeof(tagLeaveWord_W2DB), _FILE_AND_LINE_);
  259. new(pRe)tagLeaveWord_W2DB();
  260. return (tagLeaveWord_W2DB*)pRe;
  261. }
  262. //! ??WSDB??
  263. void LeaveWordSystem::ReleaseWord_W2DB(tagLeaveWord_W2DB* pLeaveWord_W2DB)
  264. {
  265. GetGame()->GetMemPool().Multi_Free(pLeaveWord_W2DB, sizeof(tagLeaveWord_W2DB));
  266. }