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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面--游戏显示玩家信息主界面
  3. // Copyright : Kingsoft 2002
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2002-8-16
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../elem/wnds.h"
  10. #include "../Elem/WndMessage.h"
  11. #include <crtdbg.h>
  12. #include "UiPlayerBar.h"
  13. #include "UiStatus.h"
  14. #include "UiSkillTree.h"
  15. #include "UiEscDlg.h"
  16. #include "UiSelColor.h"
  17. #include "UiMsgCentrePad.h"
  18. #include "UiFaceSelector.h"
  19. #include "UiMiniMap.h"
  20. #include "UiHelper.h"
  21. #include "../ShortcutKey.h"
  22. #include "../UiBase.h"
  23. #include "../UiSoundSetting.h"
  24. #include "../../../core/src/gamedatadef.h"
  25. #include "../../../core/src/MsgGenreDef.h"
  26. #include "../../../core/src/CoreObjGenreDef.h"
  27. #include "../../../core/src/coreshell.h"
  28. #include "../../TextCtrlCmd/TextCtrlCmd.h"
  29. #include "../../../Represent/iRepresent/iRepresentShell.h"
  30. #include "../../../Engine/src/Text.h"
  31. #include "../../../Headers/KRelayProtocol.h"
  32. #include "../../../Headers/KProtocolDef.h"
  33. #include "../../../Headers/KProtocol.h"
  34. #include "malloc.h"
  35. #include "UiChatCentre.h"
  36. #include "../UiChatPhrase.h"
  37. #include "../../Login/Login.h"
  38. extern KUiChatPhrase g_UiChatPhrase;
  39. extern iCoreShell* g_pCoreShell;
  40. extern iRepresentShell* g_pRepresentShell;
  41. #define SCHEME_INI "玩家信息主界面.ini"
  42. #define SCHEME_INI_MINI "玩家信息主界面最小化.ini"
  43. #define GAME_LOGO "剑侠情缘·网络版"
  44. #define SWITCH_LOGO_INTERVAL 5000
  45. #define SEL_CHANNEL_MENU 1
  46. #define SEL_PHRASE_MENU 2
  47. const char* s_TimeName[12] =
  48. {
  49. "夜半",
  50. "鸡鸣",
  51. "平旦",
  52. "日出",
  53. "食时",
  54. "隅中",
  55. "日中",
  56. "日昳",
  57. "晡时",
  58. "日入",
  59. "黄昏",
  60. "人定",
  61. };
  62. const char* s_TimeStone[12] = 
  63. {
  64. "子",
  65. "丑",
  66. "寅",
  67. "卯",
  68. "辰",
  69. "巳",
  70. "午",
  71. "未",
  72. "申",
  73. "酉",
  74. "戌",
  75. "亥"
  76. };
  77. const char* s_TimeLine[4] = { "一", "二", "三", "四" };
  78. int GetFormatedTimeString(int nTime, char* pString)
  79. {
  80. nTime += 60;
  81. return sprintf(pString, "%s%s时%s刻",
  82. s_TimeName[(nTime / 120) % 12], s_TimeStone[(nTime / 120) % 12],
  83. s_TimeLine[(nTime % 120) / 30]);
  84. //return sprintf(pString, "%s时%s刻",
  85. // s_TimeStone[(nTime / 120) % 12], s_TimeLine[(nTime % 120) / 30]);
  86. }
  87. #include "time.h"
  88. int GetFormatedTimeString(struct tm* ptm, char* pString)
  89. {
  90. return sprintf(pString, "%d月%d日 %d:%02d",
  91. ptm->tm_mon + 1,
  92. ptm->tm_mday,
  93. ptm->tm_hour,
  94. ptm->tm_min);
  95. //return sprintf(pString, "[%04d/%02d/%02d %02d:%02d:%02d]",
  96. // ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
  97. }
  98. GameWorld_DateTime::GameWorld_DateTime()
  99. {
  100. m_bTrueWorld = true;
  101. m_bLogo    = false;
  102. m_uLastSwitchTime = IR_GetCurrentTime();
  103. }
  104. IMPLEMENT_COMCLASS(GameWorld_DateTime)
  105. void GameWorld_DateTime::OnButtonClick()
  106. {
  107. m_bTrueWorld = !m_bTrueWorld;
  108. UpdateData();
  109. }
  110. int GameWorld_DateTime::Init(KIniFile* pIniFile, const char* pSection)
  111. {
  112. if(KWndLabeledButton::Init(pIniFile, pSection))
  113. {
  114. pIniFile->GetInteger(pSection, "SmoothPing", 0, &m_nSmoothPing);
  115. pIniFile->GetInteger(pSection, "CrowdPing", 0, &m_nCrowdPing);
  116. pIniFile->GetInteger(pSection, "BlockPing", 0, &m_nBlockPing);
  117. pIniFile->GetString(pSection, "SmoothMsg", "", m_szSmoothMsg, sizeof(m_szSmoothMsg));
  118. pIniFile->GetString(pSection, "CrowdMsg", "", m_szCrowdMsg, sizeof(m_szCrowdMsg));
  119. pIniFile->GetString(pSection, "BlockMsg", "", m_szBlockMsg, sizeof(m_szBlockMsg));
  120. pIniFile->GetString(pSection, "GameLogo", GAME_LOGO, m_szLogo, sizeof(m_szLogo));
  121. char Buff[16];
  122. pIniFile->GetString(pSection, "Color", "0,0,0", Buff, sizeof(Buff));
  123. m_uDefaultColor = GetColor(Buff);
  124. pIniFile->GetString(pSection, "SmoothColor", "0,0,0", Buff, sizeof(Buff));
  125. m_uSmoothColor = GetColor(Buff);
  126. pIniFile->GetString(pSection, "CrowdColor", "0,0,0", Buff, sizeof(Buff));
  127. m_uCrowdColor = GetColor(Buff);
  128. pIniFile->GetString(pSection, "BlockColor", "0,0,0", Buff, sizeof(Buff));
  129. m_uBlockColor = GetColor(Buff);
  130. }
  131. return 1;
  132. }
  133. void GameWorld_DateTime::UpdateData()
  134. {
  135. char szTime[64];
  136. if(!m_bLogo && !m_bNetStatus)
  137. {
  138.         if (!m_bTrueWorld && g_pCoreShell)
  139.     {
  140.      KUiSceneTimeInfo Info;
  141.     memset(&Info, 0, sizeof(KUiSceneTimeInfo));
  142. g_pCoreShell->SceneMapOperation(GSMOI_SCENE_TIME_INFO, (unsigned int)&Info, 0);
  143.     int nLen = GetFormatedTimeString(Info.nGameSpaceTime, szTime);
  144.     }
  145.     else
  146.     {
  147.      time_t curtm = ::time(NULL);
  148.     struct tm* ptm = localtime(&curtm);
  149.     int nLen = GetFormatedTimeString(ptm, szTime);
  150.     }
  151. SetLabelColor(m_uDefaultColor);
  152. SetLabel(szTime);
  153. }
  154. if (IR_IsTimePassed(SWITCH_LOGO_INTERVAL, m_uLastSwitchTime))
  155. {
  156. if(m_bLogo)
  157. {
  158. m_bLogo = false;
  159. UpdateNetStatus();
  160. m_bNetStatus = true;
  161. }
  162. else if(m_bNetStatus)
  163. {
  164. m_bNetStatus = false;
  165. }
  166. else
  167. {
  168. SetLabelColor(m_uDefaultColor);
  169. SetLabel(m_szLogo);
  170. m_bLogo = true;
  171. }
  172. }
  173. if (m_Flag & WNDBTN_F_OVER)
  174. {
  175. m_bLogo = false;
  176. m_bNetStatus = false;
  177. m_uLastSwitchTime = IR_GetCurrentTime();
  178. }
  179. NextFrame();
  180. }
  181. void GameWorld_DateTime::UpdateNetStatus()
  182. {
  183. int i, nPing;
  184. char Number[32], Buff[32];
  185. unsigned int uDefaultColor;
  186. if(g_pCoreShell) nPing = g_pCoreShell->GetPing();
  187. itoa(nPing, Number, 10);
  188. if(nPing >= 0 && nPing <= m_nSmoothPing)
  189. {
  190. i = strlen(m_szSmoothMsg);
  191. memcpy(Buff, m_szSmoothMsg, i);
  192. Buff[i] = ' ';
  193. memcpy(Buff + i + 1, Number, strlen(Number) + 1);
  194. uDefaultColor = m_uSmoothColor;
  195. }
  196. else if(nPing > m_nSmoothPing && nPing <= m_nCrowdPing)
  197. {
  198. i = strlen(m_szCrowdMsg);
  199. memcpy(Buff, m_szCrowdMsg, i);
  200. Buff[i] = ' ';
  201. memcpy(Buff + i + 1, Number, strlen(Number) + 1);
  202. uDefaultColor = m_uCrowdColor;
  203. }
  204. else
  205. {
  206. i = strlen(m_szBlockMsg);
  207. memcpy(Buff, m_szBlockMsg, i);
  208. Buff[i] = ' ';
  209. memcpy(Buff + i + 1, Number, strlen(Number) + 1);
  210. uDefaultColor = m_uBlockColor;
  211. }
  212. SetLabelColor(uDefaultColor);
  213. SetLabel(Buff);
  214. }
  215. int KImmediaItem::Init(KIniFile* pIniFile, const char* pSection)
  216. {
  217. int nRet = KWndObjectBox::Init(pIniFile, pSection);
  218. if (nRet)
  219. {
  220. char ChName[64];
  221. pIniFile->GetString(pSection, "TextColor", "255,255,0", ChName, sizeof(ChName));
  222. m_TextColor = GetColor(ChName);
  223. return true;
  224. }
  225. return nRet;
  226. }
  227. void KImmediaItem::PaintWindow()
  228. {
  229. KWndObjectBox::PaintWindow();
  230. if (g_pCoreShell)
  231. {
  232. int nNum = g_pCoreShell->GetGameData(GDI_IMMEDIATEITEM_NUM, m_nIndex, 0);
  233. if (nNum > 1 && nNum < 1000)
  234. {
  235. int nFontSize = 12;
  236. char szNum[4];
  237. int nLen = sprintf(szNum, "%d", nNum);
  238. szNum[3] = 0;
  239. g_pRepresentShell->OutputText(nFontSize, szNum, KRF_ZERO_END,
  240. m_nAbsoluteLeft + m_Width - nLen * (nFontSize + 1) / 2,
  241. m_nAbsoluteTop + m_Height - nFontSize - 1, m_TextColor);
  242. }
  243. }
  244. }
  245. //--------------------------------------------------------------------------
  246. KUiPlayerBar* KUiPlayerBar::m_pSelf = NULL;
  247. //--------------------------------------------------------------------------
  248. // 功能:构造函数
  249. //--------------------------------------------------------------------------
  250. KUiPlayerBar::KUiPlayerBar()
  251. {
  252. m_cPreMsgCounter = 0;
  253. m_cLatestMsgIndex= 0;
  254. m_bMiniMode = false;
  255. for (int i = 0; i < MAX_RECENT_MSG_COUNT; i++)
  256. m_RecentMsg[i][0] = 0;
  257. m_szSelfName[0] = 0;
  258. m_nCurChannel = -1;
  259. m_nRecentPlayerName = 0;
  260. memset(m_RecentPlayerName, 0, sizeof(m_RecentPlayerName));
  261. m_nExperienceFull = 0;
  262. m_nCurLevelExperience = 0;
  263. m_nExperience = 0;
  264. }
  265. KUiPlayerBar::~KUiPlayerBar()
  266. {
  267. }
  268. //--------------------------------------------------------------------------
  269. // 功能:如果窗口正被显示,则返回实例指针
  270. //--------------------------------------------------------------------------
  271. KUiPlayerBar* KUiPlayerBar::GetIfVisible()
  272. {
  273. if (m_pSelf && m_pSelf->IsVisible())
  274. return m_pSelf;
  275. return NULL;
  276. }
  277. //--------------------------------------------------------------------------
  278. // 功能:打开窗口,返回唯一的一个类对象实例
  279. //--------------------------------------------------------------------------
  280. KUiPlayerBar* KUiPlayerBar::OpenWindow()
  281. {
  282. KUiChatCentre::OpenWindow(false);
  283. if (m_pSelf == NULL)
  284. {
  285. m_pSelf = new KUiPlayerBar;
  286. if (m_pSelf)
  287. m_pSelf->Initialize();
  288. }
  289. if (m_pSelf)
  290. {
  291. m_pSelf->UpdateData();
  292. m_pSelf->Show();
  293. }
  294. m_pSelf->m_nCurChannel = -1;
  295. m_pSelf->m_nRecentPlayerName = 0;
  296. return m_pSelf;
  297. }
  298. //切换大小
  299. void KUiPlayerBar::OnSwitchSize()
  300. {
  301. m_bMiniMode = !m_bMiniMode;
  302. char Scheme[128];
  303. g_UiBase.GetCurSchemePath(Scheme, 256);
  304. LoadScheme(Scheme);
  305. }
  306. //--------------------------------------------------------------------------
  307. // 功能:更新数据
  308. //--------------------------------------------------------------------------
  309. void KUiPlayerBar::UpdateData()
  310. {
  311. //_ASSERT(g_pCoreShell);
  312. KUiPlayerBaseInfo Info;
  313. memset(&Info, 0, sizeof(KUiPlayerBaseInfo));
  314. g_pCoreShell->GetGameData(GDI_PLAYER_BASE_INFO, (int)&Info, 0);
  315. strcpy(m_szSelfName, Info.Name);
  316. int nA;
  317. int nA2;
  318. UpdateXXXNumber(nA, nA2);
  319. KUiPlayerImmedItemSkill immedItemSkillInfo;
  320. memset(&immedItemSkillInfo, 0, sizeof(KUiPlayerImmedItemSkill));
  321. g_pCoreShell->GetGameData(GDI_PLAYER_IMMED_ITEMSKILL, (int)&immedItemSkillInfo, 0);
  322. for (int i = 0; i < UPB_IMMEDIA_ITEM_COUNT; i++)
  323. {
  324. m_ImmediaItem[i].HoldObject(immedItemSkillInfo.ImmediaItem[i].uGenre,
  325. immedItemSkillInfo.ImmediaItem[i].uId, 0, 0);
  326. }
  327. m_ImmediaSkill[0].HoldObject(immedItemSkillInfo.IMmediaSkill[0].uGenre,
  328. immedItemSkillInfo.IMmediaSkill[0].uId, 0, 0);
  329. m_ImmediaSkill[1].HoldObject(immedItemSkillInfo.IMmediaSkill[1].uGenre,
  330. immedItemSkillInfo.IMmediaSkill[1].uId, 0, 0);
  331. int nM;
  332. int nL;
  333. UpdateRuntimeAttribute(nM, nL);
  334. }
  335. //--------------------------------------------------------------------------
  336. // 功能:关闭窗口,同时可以选则是否删除对象实例
  337. //--------------------------------------------------------------------------
  338. void KUiPlayerBar::CloseWindow(bool bDestroy)
  339. {
  340. if (m_pSelf)
  341. {
  342. m_pSelf->m_cLatestMsgIndex = 0;
  343. m_pSelf->m_cPreMsgCounter = 0;
  344. for(int i = 0; i < MAX_RECENT_MSG_COUNT; i++)
  345. m_pSelf->m_RecentMsg[i][0] = 0;
  346. if (bDestroy == false)
  347. m_pSelf->Hide();
  348. else
  349. {
  350. m_pSelf->Destroy();
  351. m_pSelf = NULL;
  352. }
  353. }
  354. }
  355. //--------------------------------------------------------------------------
  356. // 功能:载入界面方案
  357. //--------------------------------------------------------------------------
  358. void KUiPlayerBar::LoadScheme(const char* pScheme)
  359. {
  360. if (m_pSelf)
  361. {
  362. char Buff[128];
  363. KIniFile Ini;
  364. sprintf(Buff, "%s\%s" , pScheme, m_pSelf->m_bMiniMode ? SCHEME_INI_MINI : SCHEME_INI);
  365. if (Ini.Load(Buff))
  366. m_pSelf->LoadScheme(&Ini);
  367. }
  368. }
  369. unsigned int s_CanFocusColor = 0;
  370. unsigned int s_NotCanFocusColor = 0;
  371. void KUiPlayerBar::LoadScheme(KIniFile* pIni)
  372. {
  373. // _ASSERT(pIni);
  374. Init(pIni, $Main);
  375. m_EscDlg  .Init(pIni, "Options");
  376. m_Face    .Init(pIni, "Face");
  377. m_Friend  .Init(pIni, "Friend");
  378. m_DateTime.Init(pIni, "DateTime");
  379. char szBuffer[16];
  380. for (int i = 0; i < UPB_IMMEDIA_ITEM_COUNT; i++)
  381. {
  382. sprintf(szBuffer, "Item_%d", i);
  383. m_pSelf->m_ImmediaItem[i].Init(pIni, szBuffer);
  384. m_pSelf->m_ImmediaItem[i].m_nIndex = i;
  385. }
  386. m_ImmediaSkill[0].Init(pIni, "ImediaLeftSkill");
  387. m_ImmediaSkill[1].Init(pIni, "ImediaRightSkill");
  388. m_ImmediaSkill[0].EnablePickPut(false);
  389. m_ImmediaSkill[1].EnablePickPut(false);
  390. m_InputEdit .Init(pIni, "InputEdit");
  391. s_CanFocusColor = m_InputEdit.GetFocusBkColor();
  392. if (pIni->GetString("InputEdit", "FocusNoCanBKColor", "0,0,0", szBuffer, sizeof(szBuffer)))
  393. {
  394. s_NotCanFocusColor = (GetColor(szBuffer) & 0xffffff);
  395. int nValue;
  396. if (pIni->GetInteger("InputEdit", "FocusNoCanBKColorAlpha", 128, &nValue))
  397. {
  398. if (nValue > 255 || nValue < 0)
  399. s_NotCanFocusColor |= 0x16000000;
  400. else
  401. s_NotCanFocusColor |= (((255 - nValue) << 21) & 0xff000000);
  402. }
  403. }
  404. else
  405. {
  406. KRColor nColor;
  407. nColor.Color_dw = s_CanFocusColor;
  408. nColor.Color_b.a = 12;
  409. nColor.Color_b.r = 108;
  410. s_NotCanFocusColor = nColor.Color_dw;
  411. }
  412. m_SendBtn .Init(pIni, "SendBtn");
  413. m_ChannelSwitchBtn.Init(pIni, "ChannelBtn");
  414. m_ChannelOpenBtn.Init(pIni, "OpenChannelBtn");
  415. m_SwitchBtn .Init(pIni, "SwitchSizeBtn");
  416. }
  417. //--------------------------------------------------------------------------
  418. // 功能:初始化
  419. //--------------------------------------------------------------------------
  420. void KUiPlayerBar::Initialize()
  421. {
  422. AddChild(&m_DateTime);
  423. AddChild(&m_Face);
  424. AddChild(&m_EscDlg);
  425. AddChild(&m_Friend);
  426. for (int i = 0; i < UPB_IMMEDIA_ITEM_COUNT; i++)
  427. {
  428. m_ImmediaItem[i].SetObjectGenre(CGOG_ITEM);
  429. m_ImmediaItem[i].HoldObject(CGOG_NOTHING, 0, 0, 0);
  430. AddChild(&m_ImmediaItem[i]);
  431. m_ImmediaItem[i].SetContainerId((int)UOC_IMMEDIA_ITEM);
  432. }
  433. AddChild(&m_ImmediaSkill[0]);
  434. AddChild(&m_ImmediaSkill[1]);
  435. m_ImmediaSkill[0].SetContainerId((int)UOC_IMMEDIA_SKILL);
  436. m_ImmediaSkill[1].SetContainerId((int)UOC_IMMEDIA_SKILL);
  437. AddChild(&m_InputEdit);
  438. AddChild(&m_ChannelSwitchBtn);
  439. AddChild(&m_SendBtn);
  440. AddChild(&m_SwitchBtn);
  441. AddChild(&m_ChannelOpenBtn);
  442. char Scheme[256];
  443. g_UiBase.GetCurSchemePath(Scheme, 256);
  444. m_pSelf->LoadScheme(Scheme);
  445. Wnd_AddWindow(this);
  446. }
  447. //--------------------------------------------------------------------------
  448. // 功能:窗口函数
  449. //--------------------------------------------------------------------------
  450. int KUiPlayerBar::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  451. {
  452. int nRet = 0;
  453. switch(uMsg)
  454. {
  455. case WND_M_POPUPMENU:
  456. if (uParam == (unsigned int)(KWndWindow*)(&m_InputEdit))
  457. {
  458. PopupPhraseMenu(LOWORD(nParam), HIWORD(nParam), true);
  459. }
  460. else if (uParam == (unsigned int)(KWndWindow*)&m_ChannelSwitchBtn)
  461. {
  462. int x, y;
  463. m_ChannelSwitchBtn.GetAbsolutePos(&x, &y);
  464. PopupChannelMenu(x, y);
  465. }
  466. else if (uParam == (unsigned int)(KWndWindow*)&m_ChannelOpenBtn)
  467. {
  468. }
  469. break;
  470. case WND_N_ITEM_PICKDROP:
  471. if (g_UiBase.IsOperationEnable(UIS_O_MOVE_ITEM))
  472. OnObjPickedDropped((ITEM_PICKDROP_PLACE*)uParam, (ITEM_PICKDROP_PLACE*)nParam);
  473. break;
  474. case WND_N_BUTTON_CLICK:
  475. if (uParam == (unsigned int)(KWndWindow*)&m_Friend)
  476. KShortcutKeyCentre::ExcuteScript(SCK_SHORTCUT_FRIEND);
  477. else if (uParam == (unsigned int)(KWndWindow*)&m_EscDlg)
  478. KShortcutKeyCentre::ExcuteScript(SCK_SHORTCUT_SYSTEM);
  479. else if (uParam == (unsigned int)(KWndWindow*)&m_Face)
  480. {
  481. KUiFaceSelector::OpenWindow(this, 0);
  482. }
  483. else if (uParam == (unsigned int)(KWndWindow*)&m_SendBtn)
  484. OnSend(false);
  485. else if (uParam == (unsigned int)(KWndWindow*)&m_ChannelSwitchBtn)
  486. {
  487. int x, y;
  488. m_ChannelSwitchBtn.GetAbsolutePos(&x, &y);
  489. PopupChannelMenu(x, y);
  490. }
  491. else if (uParam == (unsigned int)(KWndWindow*)&m_ChannelOpenBtn)
  492. {
  493. }
  494. else if (uParam == (unsigned int)(KWndWindow*)&m_SwitchBtn)
  495. OnSwitchSize();
  496. break;
  497. case WND_N_LEFT_CLICK_ITEM:
  498. if (nParam == (int)(KWndWindow*)&m_ImmediaSkill[0])
  499. KUiSkillTree::OpenWindow(true);
  500. else if (nParam == (int)(KWndWindow*)&m_ImmediaSkill[1])
  501. KUiSkillTree::OpenWindow(false);
  502. break;
  503. case WND_N_RIGHT_CLICK_ITEM:
  504. if (g_UiBase.IsOperationEnable(UIS_O_USE_ITEM))
  505. {
  506. for (int i = 0; i < UPB_IMMEDIA_ITEM_COUNT; i++)
  507. if (nParam == (int)(KWndWindow*)&m_ImmediaItem[i])
  508. OnUseItem(i);
  509. }
  510. break;
  511. case WND_N_EDIT_SPECIAL_KEY_DOWN:
  512. if (nParam == VK_RETURN)
  513. {
  514. OnSend((GetKeyState(VK_CONTROL) & 0x8000));
  515. Wnd_SetFocusWnd(NULL);
  516. nRet = 1;
  517. }
  518. else if (nParam == VK_UP || nParam == VK_DOWN)
  519. {
  520. if (GetKeyState(VK_CONTROL) & 0x8000)
  521. {
  522. int x, y;
  523. m_InputEdit.GetAbsolutePos(&x, &y);
  524. int nCX = 0;
  525. m_InputEdit.GetCaretPosition(&nCX, NULL);
  526. PopupPhraseMenu(x + nCX, y, nParam == VK_DOWN);
  527. }
  528. else
  529. {
  530. InputRecentMsg(nParam == VK_UP);
  531. nRet = 1;
  532. }
  533. }
  534. else if (nParam == VK_PRIOR || nParam == VK_NEXT)
  535. {
  536. if (m_nCurChannel >= 0)
  537. {
  538. int nToChannel;
  539. if (nParam == VK_PRIOR)
  540. nToChannel = (m_nCurChannel - 1 >= 0) ? m_nCurChannel - 1 : KUiMsgCentrePad::GetChannelCount() + m_nRecentPlayerName - 1;
  541. else
  542. nToChannel = (DWORD(m_nCurChannel + 1) < (KUiMsgCentrePad::GetChannelCount() + m_nRecentPlayerName)) ? m_nCurChannel + 1 : 0;
  543. if (nToChannel != m_nCurChannel)
  544. {
  545. InputCurrentChannel(nToChannel, true);
  546. }
  547. }
  548. nRet = 1;
  549. }
  550. else if (nParam == VK_ESCAPE)
  551. {
  552. Wnd_SetFocusWnd(NULL);
  553. nRet = 1;
  554. }
  555. break;
  556. case WND_N_EDIT_CHANGE:
  557. m_cPreMsgCounter = 0;
  558. break;
  559. case WND_M_MENUITEM_SELECTED:
  560. if (uParam == (unsigned int)(KWndWindow*)this)
  561. {
  562. if (HIWORD(nParam) == SEL_CHANNEL_MENU)
  563. {
  564. if (short(LOWORD(nParam)) >= 0)
  565. {
  566. InputCurrentChannel(LOWORD(nParam), true);
  567. }
  568. KPopupMenu::Cancel();
  569. }
  570. else if (HIWORD(nParam) == SEL_PHRASE_MENU)
  571. {
  572. if (short(LOWORD(nParam)) >= 0)
  573. {
  574. char szPhrase[64];
  575. int nLen = g_UiChatPhrase.GetPhrase(LOWORD(nParam), szPhrase);
  576. m_InputEdit.InsertString(szPhrase, nLen);
  577. }
  578. }
  579. }
  580. break;
  581. case WND_M_MENUITEMRIGHT_SELECTED:
  582. if (uParam == (unsigned int)(KWndWindow*)this)
  583. {
  584. if (HIWORD(nParam) == SEL_CHANNEL_MENU)
  585. {
  586. if (short(LOWORD(nParam)) >= 0)
  587. {
  588. if (KUiMsgCentrePad::CheckChannel(LOWORD(nParam), !KUiMsgCentrePad::GetChannelSubscribe(LOWORD(nParam))))
  589. {
  590. KPopupMenuData* p = KPopupMenu::GetMenuData();
  591. if (p)
  592. {
  593. PopupChannelMenu(p->nXX, p->nYY);
  594. }
  595. }
  596. else
  597. KPopupMenu::Cancel();
  598. }
  599. else
  600. KPopupMenu::Cancel();
  601. }
  602. }
  603. break;
  604. case WND_M_OTHER_WORK_RESULT:
  605. if (nParam)
  606. {
  607. m_InputEdit.InsertString((const char*)nParam, -1);
  608. Wnd_SetFocusWnd(&m_InputEdit);
  609. }
  610. break;
  611. default:
  612. nRet = KWndImage::WndProc(uMsg, uParam, nParam);
  613. }
  614. return nRet;
  615. }
  616. void KUiPlayerBar::PaintWindow()
  617. {
  618. KWndImage::PaintWindow();
  619. int nChannelDataCount = KUiMsgCentrePad::GetChannelCount() + m_nRecentPlayerName;
  620. if (m_nCurChannel < 0 || m_nCurChannel >= nChannelDataCount)
  621. {
  622. SetCurrentChannel(0);
  623. }
  624. }
  625. void KUiPlayerBar::PopupChannelMenu(int x, int y)
  626. {
  627. int nChannelDataCount = KUiMsgCentrePad::GetChannelCount();
  628. if (nChannelDataCount + m_nRecentPlayerName <= 0)
  629. return;
  630. KPopupMenuData* pMenuData = (KPopupMenuData*)malloc(MENU_DATA_SIZE(nChannelDataCount + m_nRecentPlayerName));
  631. if (pMenuData == NULL)
  632. {
  633. return;
  634. }
  635. KPopupMenu::InitMenuData(pMenuData, nChannelDataCount + m_nRecentPlayerName);
  636. pMenuData->usMenuFlag &= ~PM_F_HAVE_HEAD_TAIL_IMG;
  637. pMenuData->usMenuFlag |= (PM_F_AUTO_DEL_WHEN_HIDE | PM_F_CANCEL_BY_CALLER);
  638. pMenuData->nItemTitleIndent = 0;
  639. pMenuData->byItemTitleUpSpace = 0;
  640. int i;
  641. pMenuData->nItemHeight = 0;
  642. WORD nHei = 0;
  643. char szText[64];
  644. for (i = 0; i < nChannelDataCount; i++)
  645. {
  646. WORD nPicIndex = -1;
  647. int nOffset = 0;
  648. KRColor uColor;
  649. KRColor uBKColor;
  650. short nCheckPicIndex = -1;
  651. if (KUiMsgCentrePad::GetChannelMenuinfo(i, &nPicIndex, &nHei, &uColor, &uBKColor, szText, &nCheckPicIndex))
  652. {
  653. pMenuData->Items[i].szData[0] = KTC_INLINE_PIC;
  654. *((WORD*)(pMenuData->Items[i].szData + 1)) = nPicIndex;
  655. pMenuData->Items[i].szData[3] = uColor.Color_b.a;
  656. pMenuData->Items[i].szData[4] = uColor.Color_b.r;
  657. pMenuData->Items[i].szData[5] = uColor.Color_b.g;
  658. pMenuData->Items[i].szData[6] = uColor.Color_b.b;
  659. nOffset = 7;
  660. if (nHei > pMenuData->nItemHeight)
  661. pMenuData->nItemHeight = nHei;
  662. strcpy(pMenuData->Items[i].szData + nOffset, szText);
  663. pMenuData->Items[i].uDataLen = strlen(szText) + nOffset;
  664. pMenuData->Items[i].szData[pMenuData->Items[i].uDataLen++] = KTC_TAB;
  665. if (nCheckPicIndex != -1)
  666. {
  667. pMenuData->Items[i].szData[pMenuData->Items[i].uDataLen] = KTC_INLINE_PIC;
  668. *((WORD*)(pMenuData->Items[i].szData + pMenuData->Items[i].uDataLen + 1)) = nCheckPicIndex;
  669. pMenuData->Items[i].uDataLen += 3;
  670. }
  671. }
  672. pMenuData->Items[i].uBgColor = uBKColor.Color_dw;
  673. pMenuData->usMenuFlag |= PM_F_TAB_SPLIT_ITEM_TEXT;
  674. }
  675. if (nHei > 0)
  676.         pMenuData->nItemRightWidth = MENU_ITEM_DEFAULT_RIGHT_WIDTH;
  677. else
  678. pMenuData->nItemRightWidth = 0;
  679. for (; i < nChannelDataCount + m_nRecentPlayerName; i++)
  680. {
  681. if (m_RecentPlayerName[i - nChannelDataCount][0] != 0)
  682. {
  683. WORD nPicIndex = -1;
  684. int nOffset = 0;
  685. KRColor uColor;
  686. KRColor uBKColor;
  687. if (KUiMsgCentrePad::GetPeopleMenuinfo(m_RecentPlayerName[i - nChannelDataCount], &nPicIndex, &nHei, &uColor, &uBKColor))
  688. {
  689. pMenuData->Items[i].szData[0] = KTC_INLINE_PIC;
  690. *((WORD*)(pMenuData->Items[i].szData + 1)) = nPicIndex;
  691. pMenuData->Items[i].szData[3] = uColor.Color_b.a;
  692. pMenuData->Items[i].szData[4] = uColor.Color_b.r;
  693. pMenuData->Items[i].szData[5] = uColor.Color_b.g;
  694. pMenuData->Items[i].szData[6] = uColor.Color_b.b;
  695. nOffset = 7;
  696. if (nHei > pMenuData->nItemHeight)
  697. pMenuData->nItemHeight = nHei;
  698. }
  699. strcpy(pMenuData->Items[i].szData + nOffset, m_RecentPlayerName[i - nChannelDataCount]);
  700. pMenuData->Items[i].uDataLen = strlen(m_RecentPlayerName[i - nChannelDataCount]) + nOffset;
  701. pMenuData->Items[i].uBgColor = uBKColor.Color_dw;
  702. }
  703. else
  704. {
  705. break;
  706. }
  707. }
  708. pMenuData->nNumItem = i;
  709. pMenuData->nX = x;
  710. pMenuData->nY = y;
  711. pMenuData->nSelectedItem = m_nCurChannel;
  712. KPopupMenu::Popup(pMenuData, (KWndWindow*)this, SEL_CHANNEL_MENU);
  713. }
  714. void KUiPlayerBar::PopupPhraseMenu(int x, int y, bool bFirstItem)
  715. {
  716. int nDataCount = g_UiChatPhrase.GetPhraseCount();
  717. if (nDataCount <= 0)
  718. return;
  719. KPopupMenuData* pMenuData = (KPopupMenuData*)malloc(MENU_DATA_SIZE(nDataCount));
  720. if (pMenuData == NULL)
  721. {
  722. return;
  723. }
  724. KPopupMenu::InitMenuData(pMenuData, nDataCount);
  725. pMenuData->usMenuFlag &= ~PM_F_HAVE_HEAD_TAIL_IMG;
  726. pMenuData->usMenuFlag |= PM_F_AUTO_DEL_WHEN_HIDE;
  727. pMenuData->nItemTitleIndent = 0;
  728. pMenuData->byItemTitleUpSpace = 0;
  729. int i;
  730. for (i = 0; i < nDataCount; i++)
  731. {
  732. pMenuData->Items[i].uDataLen = g_UiChatPhrase.GetPhrase(i, pMenuData->Items[i].szData);
  733. }
  734. pMenuData->nNumItem = nDataCount;
  735. pMenuData->nX = x;
  736. pMenuData->nY = y;
  737. pMenuData->nSelectedItem = bFirstItem ? 0 : nDataCount - 1;
  738. KPopupMenu::Popup(pMenuData, (KWndWindow*)this, SEL_PHRASE_MENU);
  739. }
  740. #include "../ChatFilter.h"
  741. extern CChatFilter g_ChatFilter;
  742. void KUiPlayerBar::OnSend(BOOL bDirectSend)
  743. {
  744. char Buffer[512];
  745. int     nName = 0;
  746. int     nMsgLength = m_InputEdit.GetText(Buffer, sizeof(Buffer), true);
  747. if (nMsgLength <= 0)
  748. return;
  749. //====保存到最近发送消息记录里====
  750. memcpy(m_RecentMsg[m_cLatestMsgIndex], Buffer, nMsgLength);
  751. m_RecentMsg[m_cLatestMsgIndex][nMsgLength] = 0;
  752. m_cLatestMsgIndex = (m_cLatestMsgIndex + 1) % MAX_RECENT_MSG_COUNT;
  753. m_cPreMsgCounter = 0;
  754. if (!bDirectSend)
  755. {
  756. if (TextMsgFilter(Buffer, nMsgLength)) //客户端控制命令执行过滤
  757. {
  758. m_InputEdit.ClearText();
  759. return;
  760. }
  761. }
  762. if (g_pCoreShell == NULL)
  763. return;
  764. //====获取输入子串前端可能指定有的消息传送目标====
  765. int bChannel = false;
  766. int nDestChannel = -1;
  767. char Name[32];
  768. Name[0] = 0;
  769. if (Buffer[nName] == TEXT_CTRL_CHAT_PREFIX || Buffer[nName] == TEXT_CTRL_CHANNEL_PREFIX)
  770. {
  771. bChannel = (Buffer[nName] == TEXT_CTRL_CHANNEL_PREFIX);
  772. while (nName < nMsgLength)
  773. {
  774. if (Buffer[nName] == ' ')
  775. {
  776. Buffer[nName] = 0;
  777. nName++;
  778. break;
  779. }
  780. nName++;
  781. }
  782. if (bChannel)
  783. {
  784. ReplaceSpecialName(Name, 31, Buffer + 1);
  785. nDestChannel = GetChannelIndex(Name);
  786. }
  787. else
  788. {
  789. strncpy(Name, Buffer + 1, 31);
  790. }
  791. Name[31] = 0;
  792. }
  793. if (Name[0] == 0) //不指定名字
  794. {
  795. bChannel = true;
  796. int nChannelDataCount = KUiMsgCentrePad::GetChannelCount();
  797. if (m_nCurChannel >= 0 && m_nCurChannel < nChannelDataCount)
  798. {
  799. nDestChannel = m_nCurChannel;
  800. }
  801. else
  802. {
  803. //是附近玩家
  804. for (int n = 0; n < nChannelDataCount; n++)
  805. {
  806. if (KUiMsgCentrePad::IsChannelType(n, KUiMsgCentrePad::ch_Screen))
  807. {
  808. nDestChannel = n;
  809. break;
  810. }
  811. }
  812. }
  813. if (nDestChannel >= 0)
  814. strncpy(Name, KUiMsgCentrePad::GetChannelTitle(nDestChannel), 31);
  815. Name[31] = 0;
  816. }
  817. else //指定名字的恢复Buffer数据
  818. {
  819. Buffer[nName - 1] = ' ';
  820. }
  821. nMsgLength -= nName;
  822. if (bChannel && !KUiMsgCentrePad::IsChannelType(nDestChannel, KUiMsgCentrePad::ch_GM)) //在非GM频道中输入GM指令,不发送出去,以免泄密
  823. {
  824. if (nMsgLength > 3 &&
  825. Buffer[nName] == '?' &&
  826. (Buffer[nName + 1] == 'g' || Buffer[nName + 1] == 'G') &&
  827. (Buffer[nName + 2] == 'm' || Buffer[nName + 2] == 'M'))
  828. return;
  829. }
  830. if (!g_ChatFilter.IsTextPass(Buffer + nName))
  831. {
  832. char szWarning[] = "请您不要在消息中使用不合适的词语!"; 
  833. KUiMsgCentrePad::SystemMessageArrival(szWarning, sizeof(szWarning));
  834. return;
  835. }
  836. char szEvent[1024];
  837. if (bChannel)
  838. sprintf(szEvent, APP_CHAT, Name, Buffer + nName);
  839. else
  840. sprintf(szEvent, APP_SAY, Name, Buffer + nName);
  841. szEvent[1023] = 0;
  842. if (g_UiBase.NotifyEvent(szEvent) == 0)
  843. return;
  844. char Buffer2[1536];
  845.     nMsgLength = KUiFaceSelector::ConvertFaceText(Buffer2, Buffer + nName, nMsgLength);
  846. nMsgLength = TEncodeText(Buffer2, nMsgLength);
  847. if (bChannel)
  848. {
  849. DWORD nChannelID = KUiMsgCentrePad::GetChannelID(nDestChannel);
  850. if (nChannelID != -1)
  851. {
  852. KUiMsgCentrePad::CheckChannel(nDestChannel, true);
  853. OnSendChannelMessage(nChannelID, Buffer2, nMsgLength);
  854. m_InputEdit.ClearText();
  855. InputCurrentChannel(nDestChannel, true);
  856. }
  857. }
  858. else if (!IsSelfName(Name))
  859. {
  860. OnSendSomeoneMessage(Name, Buffer2, nMsgLength);
  861. int nAdd = AddRecentPlayer(Name);
  862. if (nAdd >= 0)
  863. {
  864. m_InputEdit.ClearText();
  865. InputCurrentChannel(nAdd, true);
  866. }
  867. }
  868. }
  869. BOOL KUiPlayerBar::IsCanSendMessage(const char* Buffer, int nLen, char* szDestName, int nChannelID)
  870. {
  871. if (m_pSelf)
  872. {
  873. if (Buffer && nLen > 0 && !g_ChatFilter.IsTextPass(Buffer))
  874. return FALSE;
  875. char szEvent[1024];
  876. if (nChannelID >= 0)
  877. sprintf(szEvent, APP_CHAT, szDestName, Buffer);
  878. else
  879. sprintf(szEvent, APP_SAY, szDestName, Buffer);
  880. szEvent[1023] = 0;
  881. if (g_UiBase.NotifyEvent(szEvent) == 0)
  882. return FALSE;
  883. }
  884. return TRUE;
  885. }
  886. void KUiPlayerBar::OnSendChannelMessage(DWORD nChannelID, const char* Buffer, int nLen) //发送频道聊天到服务器
  887. {
  888. if (nChannelID != -1 && Buffer && nLen > 0)
  889. {
  890. int nLeft = KUiMsgCentrePad::PushChannelData(nChannelID, Buffer, nLen);
  891. if (nLeft < 0)
  892. {
  893. char szWarning[] = "千里传音无法连续使用,请您先运息片刻。";
  894. KUiMsgCentrePad::SystemMessageArrival(szWarning, sizeof(szWarning));
  895. }
  896. else if (nLeft > 0)
  897. {
  898. char szWarning[64];
  899. sprintf(szWarning, "消息将在%d秒后发出!", (nLeft + 999 ) / 1000);
  900. KUiMsgCentrePad::SystemMessageArrival(szWarning, strlen(szWarning) + 1);
  901. }
  902. }
  903. }
  904. void KUiPlayerBar::OnDirectSendChannelMessage(DWORD nChannelID, BYTE cost, const char* Buffer, int nLen) //发送频道聊天到服务器
  905. {
  906. if (g_pCoreShell && nChannelID != -1 && Buffer && nLen > 0)
  907. {
  908. size_t chatsize = sizeof(CHAT_CHANNELCHAT_CMD) + nLen;
  909. size_t pckgsize = sizeof(tagExtendProtoHeader) + chatsize;
  910. tagExtendProtoHeader* pExHeader = (tagExtendProtoHeader*)_alloca(pckgsize);
  911. pExHeader->ProtocolType = c2s_extendchat;
  912. pExHeader->wLength = pckgsize - 1;
  913. CHAT_CHANNELCHAT_CMD* pCccCmd = (CHAT_CHANNELCHAT_CMD*)(pExHeader + 1);
  914. pCccCmd->ProtocolType = chat_channelchat;
  915. pCccCmd->wSize = chatsize - 1;
  916. pCccCmd->packageID = -1;
  917. pCccCmd->filter = 1;
  918. pCccCmd->channelid = nChannelID;
  919. pCccCmd->cost = cost;
  920. pCccCmd->sentlen = nLen;
  921. memcpy(pCccCmd + 1, Buffer, nLen);
  922. g_pCoreShell->SendNewDataToServer(pExHeader, pckgsize);
  923. }
  924. }
  925. void KUiPlayerBar::OnSendSomeoneMessage(const char* Name, const char* Buffer, int nLen) //发送someone聊天到服务器
  926. {
  927. if (g_pCoreShell && Name && Name[0] != 0 && Buffer && nLen > 0 && m_pSelf)
  928. {
  929. size_t chatsize = sizeof(CHAT_SOMEONECHAT_CMD) + nLen;
  930. size_t pckgsize = sizeof(tagExtendProtoHeader) + chatsize;
  931. tagExtendProtoHeader* pExHeader = (tagExtendProtoHeader*)_alloca(pckgsize);
  932. pExHeader->ProtocolType = c2s_extendchat;
  933. pExHeader->wLength = pckgsize - 1;
  934. CHAT_SOMEONECHAT_CMD* pCscCmd = (CHAT_SOMEONECHAT_CMD*)(pExHeader + 1);
  935. pCscCmd->ProtocolType = chat_someonechat;
  936. pCscCmd->wSize = chatsize - 1;
  937. pCscCmd->packageID = -1;
  938. strcpy(pCscCmd->someone, Name);
  939. pCscCmd->sentlen = nLen;
  940. memcpy(pCscCmd + 1, Buffer, nLen);
  941. g_pCoreShell->SendNewDataToServer(pExHeader, pckgsize);
  942. }
  943. }
  944. void KUiPlayerBar::InputRecentMsg(bool bPrior)
  945. {
  946. int nCounter;
  947. if (bPrior)
  948. nCounter = m_cPreMsgCounter - 1;
  949. else
  950. nCounter = m_cPreMsgCounter + 1;
  951. if (nCounter < 0 && nCounter >= - MAX_RECENT_MSG_COUNT)
  952. {
  953. int nIndex = m_cLatestMsgIndex + nCounter;
  954. if (nIndex < 0)
  955. nIndex += 8;
  956. if (m_RecentMsg[nIndex][0])
  957. {
  958. m_InputEdit.SetText(m_RecentMsg[nIndex]);
  959. m_cPreMsgCounter = nCounter;
  960. }
  961. }
  962. else if (nCounter >= 0)
  963. {
  964. m_InputEdit.ClearText();
  965. m_cPreMsgCounter = 0;
  966. }
  967. }
  968. //--------------------------------------------------------------------------
  969. // 功能:响应界面操作取起放下东西
  970. //--------------------------------------------------------------------------
  971. void KUiPlayerBar::OnObjPickedDropped(ITEM_PICKDROP_PLACE* pPickPos, ITEM_PICKDROP_PLACE* pDropPos)
  972. {
  973. KUiObjAtContRegion Pick, Drop;
  974. KUiDraggedObject Obj;
  975. KWndWindow* pWnd = NULL;
  976. if (pPickPos)
  977. {
  978. _ASSERT(pPickPos->pWnd);
  979. ((KWndObjectBox*)(pPickPos->pWnd))->GetObject(Obj);
  980. Pick.Obj.uGenre = Obj.uGenre;
  981. Pick.Obj.uId = Obj.uId;
  982. Pick.Region.Width = Obj.DataW;
  983. Pick.Region.Height = Obj.DataH;
  984. Pick.Region.v = 0;
  985. Pick.eContainer = UOC_IMMEDIA_ITEM;
  986. pWnd = pPickPos->pWnd;
  987. }
  988. else if (pDropPos)
  989. {
  990. pWnd = pDropPos->pWnd;
  991. }
  992. else
  993. return;
  994. if (pDropPos)
  995. {
  996. Wnd_GetDragObj(&Obj);
  997. Drop.Obj.uGenre = Obj.uGenre;
  998. Drop.Obj.uId = Obj.uId;
  999. Drop.Region.Width = Obj.DataW;
  1000. Drop.Region.Height = Obj.DataH;
  1001. Drop.Region.v = 0;
  1002. Drop.eContainer = UOC_IMMEDIA_ITEM;
  1003. }
  1004. for (int i = 0; i < UPB_IMMEDIA_ITEM_COUNT; i++)
  1005. {
  1006. if (pWnd == (KWndWindow*)&m_ImmediaItem[i])
  1007. {
  1008. Drop.Region.h = Pick.Region.h = i;
  1009. break;
  1010. }
  1011. }
  1012. _ASSERT(i < UPB_IMMEDIA_ITEM_COUNT);
  1013. g_pCoreShell->OperationRequest(GOI_SWITCH_OBJECT, 
  1014. pPickPos ? (unsigned int)&Pick : 0,
  1015. pDropPos ? (int)&Drop : 0);
  1016. }
  1017. //--------------------------------------------------------------------------
  1018. // 功能:使用物品
  1019. //--------------------------------------------------------------------------
  1020. void KUiPlayerBar::OnUseItem(int nIndex)
  1021. {
  1022. if (m_pSelf && nIndex >= 0 && nIndex < UPB_IMMEDIA_ITEM_COUNT)
  1023. {
  1024. KUiDraggedObject Obj;
  1025. m_pSelf->m_ImmediaItem[nIndex].GetObject(Obj);
  1026. KUiObjAtRegion Info;
  1027. {
  1028. Info.Obj.uGenre = Obj.uGenre;
  1029. Info.Obj.uId = Obj.uId;
  1030. Info.Region.h = nIndex;
  1031. Info.Region.v = 0;
  1032. Info.Region.Width = Info.Region.Height = 0;
  1033. }
  1034. g_pCoreShell->OperationRequest(GOI_USE_ITEM, (int)&Info, UOC_IMMEDIA_ITEM);
  1035. }
  1036. }
  1037. int KUiPlayerBar::GetChannelIndex(const char* pTitle)
  1038. {
  1039. if (pTitle)
  1040. {
  1041. int nChannelDataCount = KUiMsgCentrePad::GetChannelCount();
  1042. int n = KUiMsgCentrePad::GetChannelIndex((char*)pTitle);
  1043. if (n >= 0 && n < nChannelDataCount)
  1044. return n;
  1045. n = nChannelDataCount;
  1046. for (; n < nChannelDataCount + m_nRecentPlayerName; n++)
  1047. {
  1048. if (m_RecentPlayerName[n - nChannelDataCount][0] == 0)
  1049. break;
  1050. if (strcmp(m_RecentPlayerName[n - nChannelDataCount], pTitle) == 0)
  1051. {
  1052. return n;
  1053. }
  1054. }
  1055. }
  1056. return -1;
  1057. }
  1058. void KUiPlayerBar::SetCurrentChannel(int nIndex)
  1059. {
  1060. if (!m_pSelf)
  1061. return;
  1062. if (nIndex < 0)
  1063. return;
  1064. if (nIndex == m_pSelf->m_nCurChannel)
  1065. return;
  1066. int nChannelDataCount = KUiMsgCentrePad::GetChannelCount();
  1067. if (nIndex < nChannelDataCount)
  1068. {
  1069. m_pSelf->m_nCurChannel = nIndex;
  1070. WORD nPicIndex = -1;
  1071. if (KUiMsgCentrePad::GetChannelMenuinfo(m_pSelf->m_nCurChannel, &nPicIndex))
  1072. {
  1073. char buffer[3];
  1074. buffer[0] = KTC_INLINE_PIC;
  1075. *((WORD*)(buffer + 1)) = nPicIndex;
  1076. m_pSelf->m_ChannelSwitchBtn.SetText(buffer, 3);
  1077. }
  1078. }
  1079. else if (nIndex < nChannelDataCount + m_pSelf->m_nRecentPlayerName)
  1080. {
  1081. m_pSelf->m_nCurChannel = nIndex;
  1082. WORD nPicIndex = -1;
  1083. if (KUiMsgCentrePad::GetPeopleMenuinfo(m_pSelf->m_RecentPlayerName[m_pSelf->m_nCurChannel - nChannelDataCount], &nPicIndex))
  1084. {
  1085. char buffer[3];
  1086. buffer[0] = KTC_INLINE_PIC;
  1087. *((WORD*)(buffer + 1)) = nPicIndex;
  1088. m_pSelf->m_ChannelSwitchBtn.SetText(buffer, 3);
  1089. }
  1090. else
  1091. m_pSelf->m_ChannelSwitchBtn.SetText(m_pSelf->m_RecentPlayerName[m_pSelf->m_nCurChannel - nChannelDataCount]);
  1092. }
  1093. }
  1094. void KUiPlayerBar::InputCurrentChannel(int nIndex, bool bFocus)
  1095. {
  1096. if (nIndex < 0)
  1097. return;
  1098. int nChannelDataCount = KUiMsgCentrePad::GetChannelCount();
  1099. if (nIndex < nChannelDataCount)
  1100. {
  1101. InputNameMsg(true, KUiMsgCentrePad::GetChannelTitle(nIndex), bFocus);
  1102. SetCurrentChannel(nIndex);
  1103. }
  1104. else if (nIndex < nChannelDataCount + m_nRecentPlayerName)
  1105. {
  1106. InputNameMsg(false, m_RecentPlayerName[nIndex - nChannelDataCount], bFocus);
  1107. SetCurrentChannel(nIndex);
  1108. }
  1109. }
  1110. //--------------------------------------------------------------------------
  1111. // 功能:切换到下一个频道
  1112. //--------------------------------------------------------------------------
  1113. void KUiPlayerBar::SwitchChannel(BOOL bUp)
  1114. {
  1115. if(m_pSelf)
  1116. {
  1117. int nNewChannelID;
  1118. int nCount = KUiMsgCentrePad::GetChannelCount();
  1119. if(bUp)
  1120. {
  1121. if(m_pSelf->m_nCurChannel < 1)
  1122.     {
  1123.     nNewChannelID = nCount - 1;
  1124.     }
  1125.     else
  1126.     {
  1127.      nNewChannelID = m_pSelf->m_nCurChannel - 1;
  1128.     }
  1129. }
  1130. else
  1131. {
  1132.     if(m_pSelf->m_nCurChannel > nCount - 2)
  1133.     {
  1134.     nNewChannelID = 0;
  1135.     }
  1136.     else
  1137.     {
  1138.      nNewChannelID = m_pSelf->m_nCurChannel + 1;
  1139.     }
  1140. }
  1141. m_pSelf->InputCurrentChannel(nNewChannelID, FALSE);
  1142. }
  1143. }
  1144. //--------------------------------------------------------------------------
  1145. //  功能:得到PlayerBar里当前的频道
  1146. //--------------------------------------------------------------------------
  1147. int KUiPlayerBar::GetCurChannel()
  1148. {
  1149. if(m_pSelf)
  1150.     return m_pSelf->m_nCurChannel;
  1151. else
  1152. return -1;
  1153. }
  1154. //--------------------------------------------------------------------------
  1155. // 功能:更新常变的那些数值数据
  1156. //--------------------------------------------------------------------------
  1157. void KUiPlayerBar::UpdateXXXNumber(int& nMana, int& nFullMana)
  1158. {
  1159. KUiPlayerRuntimeInfo Info;
  1160. memset(&Info, 0, sizeof(KUiPlayerRuntimeInfo));
  1161. g_pCoreShell->GetGameData(GDI_PLAYER_RT_INFO, (int)&Info, 0);
  1162. m_nExperienceFull = Info.nExperienceFull;
  1163. m_nCurLevelExperience = Info.nCurLevelExperience;
  1164. m_nExperience = Info.nExperience;
  1165. KUiStatus* pStatus = KUiStatus::GetIfVisible();
  1166. if (pStatus)
  1167. pStatus->UpdateRuntimeInfo(&Info);
  1168. KUiSceneTimeInfo Spot;
  1169. g_pCoreShell->SceneMapOperation(GSMOI_SCENE_TIME_INFO, (unsigned int)&Spot, 0);
  1170. KUiMiniMap::UpdateSceneTimeInfo(&Spot);
  1171. nMana = max(Info.nMana, 0);
  1172. nFullMana = max(Info.nManaFull, 0);
  1173. }
  1174. void KUiPlayerBar::UpdateRuntimeAttribute(int& nMoney, int& nLevel)
  1175. {
  1176. KUiPlayerAttribute Info;
  1177. memset(&Info, 0, sizeof(KUiPlayerAttribute));
  1178. g_pCoreShell->GetGameData(GDI_PLAYER_RT_ATTRIBUTE, (unsigned int)&Info, 0);
  1179. KUiStatus* pStatus = KUiStatus::GetIfVisible();
  1180. if (pStatus)
  1181. pStatus->UpdateRuntimeAttribute(&Info);
  1182. nMoney = Info.nMoney;
  1183. nLevel = Info.nLevel;
  1184. }
  1185. //--------------------------------------------------------------------------
  1186. // 功能:变更物品摆换
  1187. //--------------------------------------------------------------------------
  1188. void KUiPlayerBar::UpdateItem(int nIndex, unsigned int uGenre, unsigned int uId)
  1189. {
  1190. if (nIndex >= 0 && nIndex < UPB_IMMEDIA_ITEM_COUNT)
  1191. {
  1192. UiSoundPlay(UI_SI_PICKPUT_ITEM);
  1193. m_ImmediaItem[nIndex].HoldObject(uGenre, uId, 0, 0);
  1194. }
  1195. }
  1196. //--------------------------------------------------------------------------
  1197. // 功能:变更快捷技能
  1198. //--------------------------------------------------------------------------
  1199. void KUiPlayerBar::UpdateSkill(int nIndex, unsigned int uGenre, unsigned int uId)
  1200. {
  1201. if (nIndex == 0 || nIndex == 1)
  1202. {
  1203. m_ImmediaSkill[nIndex].HoldObject(uGenre, uId, 0, 0);
  1204. }
  1205. }
  1206. //--------------------------------------------------------------------------
  1207. // 功能:我要呼吸
  1208. //--------------------------------------------------------------------------
  1209. void KUiPlayerBar::Breathe()
  1210. {
  1211. if (g_LoginLogic.GetStatus() != LL_S_IN_GAME)
  1212. return;
  1213. m_DateTime.UpdateData();
  1214. int nMana;
  1215. int nFullMana;
  1216. UpdateXXXNumber(nMana, nFullMana);
  1217. int nMoney;
  1218. int nLevel;
  1219. UpdateRuntimeAttribute(nMoney, nLevel);
  1220. DWORD dwID;
  1221. BYTE cost;
  1222. char* Buffer;
  1223. int nLen;
  1224. int nUseMana = 0;
  1225. int nUseMoney = 0;
  1226. int nUseLevel = 0;
  1227. while(KUiMsgCentrePad::GetChannelData(dwID, cost, Buffer, nLen))
  1228. {
  1229. int nRet = IsHasCost(cost, nMoney, nLevel, nMana, nFullMana,
  1230. nUseMoney, nUseLevel, nUseMana);
  1231. bool bSend = !nRet;
  1232. char szSystem[256];
  1233. szSystem[0] = 0;
  1234. if (!bSend)
  1235. {
  1236. if (nRet == 2 && nUseLevel > 0)
  1237. sprintf(szSystem, "您的等级不足%d级,无法使用千里传音发送消息。", nUseLevel);
  1238. if (nRet == 1 && nUseMoney > 0)
  1239. sprintf(szSystem, "您的银两不足%d两,无法使用千里传音发送消息。", nUseMoney);
  1240. if (nRet == 3 && nUseMana > 0)
  1241. sprintf(szSystem, "您的内力不足%d点,无法使用千里传音发送消息。", nUseMana);
  1242. }
  1243. else
  1244. {
  1245. if (nUseMoney > 0)
  1246. sprintf(szSystem, "您使用千里传音, 花费银两%d两。", nUseMoney);
  1247. if (nUseMana > 0)
  1248. sprintf(szSystem, "您使用千里传音, 消耗内力%d点。", nUseMana);
  1249. }
  1250. if (bSend)
  1251. OnDirectSendChannelMessage(dwID, cost, Buffer, nLen);
  1252. KUiMsgCentrePad::PopChannelData(dwID);
  1253. if (szSystem[0])
  1254. KUiMsgCentrePad::SystemMessageArrival(szSystem, strlen(szSystem));
  1255. }
  1256. if (m_nCurChannel >= 0 && m_nCurChannel < (int)KUiMsgCentrePad::GetChannelCount() &&
  1257. Wnd_GetFocusWnd() == (KWndWindow*)&m_InputEdit)
  1258. {
  1259. cost = KUiMsgCentrePad::GetChannelCost(KUiMsgCentrePad::GetChannelID(m_nCurChannel));
  1260. if (IsHasCost(cost, nMoney, nLevel, nMana, nFullMana,
  1261. nUseMoney, nUseLevel, nUseMana) != 0)
  1262. m_InputEdit.SetFocusBkColor(s_NotCanFocusColor);
  1263. else
  1264. m_InputEdit.SetFocusBkColor(s_CanFocusColor);
  1265. }
  1266. }
  1267. //0 成功, 返回消耗的银两和内力
  1268. //1 因为nUseMoney,钱不足
  1269. //2 因为nUseLevel,等级不足
  1270. //3 因为nUseMana,内力不足
  1271. int KUiPlayerBar::IsHasCost(BYTE cost, int nMoney, int nLevel, int nMana, int nFullMana, int& nUseMoney, int& nUseLevel, int& nUseMana)
  1272. {
  1273. if (cost == 0)//免费
  1274. {
  1275. nUseMoney = 0;
  1276. nUseLevel = 0;
  1277. nUseMana = 0;
  1278. }
  1279. else if (cost == 1)//10元每句
  1280. {
  1281. if (nMoney < 10)
  1282. {
  1283. nUseMoney = 10;
  1284. return 1;
  1285. }
  1286. nUseMoney = 10;
  1287. nUseLevel = 0;
  1288. nUseMana = 0;
  1289. }
  1290. else if (cost == 2)//2: <10Lv ? 不能说 : MaxMana/2/句
  1291. {
  1292. if (nLevel < 10)
  1293. {
  1294. nUseLevel = 10;
  1295. return 2;
  1296. }
  1297. if (nMana < nFullMana / 2)
  1298. {
  1299. nUseMana = nFullMana / 2;
  1300. return 3;
  1301. }
  1302. nUseMoney = 0;
  1303. nUseLevel = 0;
  1304. nUseMana = nFullMana / 2;
  1305. }
  1306. else if (cost == 3)//3: MaxMana/10/句
  1307. {
  1308. if (nMana < nFullMana / 10)
  1309. {
  1310. nUseMana = nFullMana / 10;
  1311. return 3;
  1312. }
  1313. nUseMoney = 0;
  1314. nUseLevel = 0;
  1315. nUseMana = nFullMana / 10;
  1316. }
  1317. else if (cost == 4)//4: <20Lv ? 不能说 : MaxMana*4/5/句
  1318. {
  1319. if (nLevel < 20)
  1320. {
  1321. nUseLevel = 20;
  1322. return 2;
  1323. }
  1324. if (nMana < nFullMana * 4 / 5)
  1325. {
  1326. nUseMana = nFullMana * 4 / 5;
  1327. return 3;
  1328. }
  1329. nUseMoney = 0;
  1330. nUseLevel = 0;
  1331. nUseMana = nFullMana * 4 / 5;
  1332. }
  1333. else
  1334. {
  1335. nUseMoney = 0;
  1336. nUseLevel = 0;
  1337. nUseMana = 0;
  1338. }
  1339. return 0;
  1340. }
  1341. //--------------------------------------------------------------------------
  1342. // 功能:往输入框入姓名字符串
  1343. //--------------------------------------------------------------------------
  1344. void KUiPlayerBar::InputNameMsg(char bChannel, const char* szName, bool bFocus)
  1345. {
  1346. if (m_pSelf == NULL)
  1347. return;
  1348. if (bFocus)
  1349. Wnd_SetFocusWnd(&m_pSelf->m_InputEdit);
  1350. if (szName == NULL || szName[0] == 0) //名字输入为空返回
  1351. return;
  1352. if (bChannel) //当输入为频道时,什么都不做,因为用户不需要此功能,但是后面的代码难得改了
  1353. return;
  1354. char Buffer[512];
  1355. int nLen = m_pSelf->m_InputEdit.GetText(Buffer, sizeof(Buffer), false);
  1356. if (nLen < 0)
  1357. nLen = 0;
  1358. Buffer[nLen] = 0;
  1359. int nName = 0;
  1360. if (Buffer[nName] == TEXT_CTRL_CHAT_PREFIX)
  1361. {
  1362. while (nName <= nLen)
  1363. {
  1364. if (Buffer[nName] == ' ' ||
  1365. Buffer[nName] == 0)
  1366. {
  1367. Buffer[nName] = 0;
  1368. break;
  1369. }
  1370. nName++;
  1371. }
  1372. if (nName > nLen) //原输入中没有名字
  1373. nName = 0;
  1374. }
  1375. if (bChannel)
  1376. {
  1377. m_pSelf->m_InputEdit.SetText("");
  1378. //m_pSelf->m_InputEdit.SetText("&");
  1379. //m_pSelf->m_InputEdit.InsertString(szName, strlen(szName));
  1380. //m_pSelf->m_InputEdit.InsertString(" ", 1);
  1381. m_pSelf->m_InputEdit.InsertString(Buffer + nName, nLen - nName);
  1382. }
  1383. else
  1384. {
  1385. if (nName > 0 &&
  1386. (KShortcutKeyCentre::FindCommand(Buffer + 1) >= 0 ||
  1387. KShortcutKeyCentre::ms_FunsMap.find(Buffer + 1) != KShortcutKeyCentre::ms_FunsMap.end()
  1388. )) //当原输入串中有"/"且是函数关键字时
  1389. { //只追加" name"
  1390. m_pSelf->m_InputEdit.InsertString(" ", 1);
  1391. m_pSelf->m_InputEdit.InsertString(szName, strlen(szName));
  1392. }
  1393. else
  1394. {
  1395. m_pSelf->m_InputEdit.SetText("/");
  1396. m_pSelf->m_InputEdit.InsertString(szName, strlen(szName));
  1397. m_pSelf->m_InputEdit.InsertString(" ", 1);
  1398. m_pSelf->m_InputEdit.InsertString(Buffer + nName, nLen - nName);
  1399. }
  1400. }
  1401. }
  1402. int KUiPlayerBar::FindRecentPlayer(const char* szName)
  1403. {
  1404. if (szName == NULL || szName[0] == 0)
  1405. return -1;
  1406. for (int n = 0; n < m_pSelf->m_nRecentPlayerName; n++)
  1407. {
  1408. if (m_pSelf->m_RecentPlayerName[n][0] == 0)
  1409. {
  1410. break;
  1411. }
  1412. if (strcmp(m_pSelf->m_RecentPlayerName[n], szName) == 0)
  1413. {
  1414. return n;
  1415. }
  1416. }
  1417. return -1;
  1418. }
  1419. //--------------------------------------------------------------------------
  1420. // 功能:根据index取得某密聊频道的目标玩家名
  1421. //--------------------------------------------------------------------------
  1422. char* KUiPlayerBar::GetRecentPlayerName(int nIndex)
  1423. {
  1424. int nChannelCount = KUiMsgCentrePad::GetChannelCount();
  1425. if(m_pSelf && nIndex >= nChannelCount && nIndex < m_pSelf->m_nRecentPlayerName + nChannelCount)
  1426. {
  1427. return m_pSelf->m_RecentPlayerName[nIndex - nChannelCount];
  1428. }
  1429. else
  1430. {
  1431. return "";
  1432. }
  1433. }
  1434. int KUiPlayerBar::AddRecentPlayer(const char* szName)
  1435. {
  1436. if (!m_pSelf)
  1437. return -1;
  1438. if (szName == NULL || szName[0] == 0)
  1439. return -1;
  1440. if (strcmp(m_pSelf->m_szSelfName, szName) == 0)
  1441. return -1;
  1442. int n = m_pSelf->GetChannelIndex(szName);
  1443. if (n >= 0)
  1444. return n;
  1445. n = 0;
  1446. int nChannelDataCount = KUiMsgCentrePad::GetChannelCount();
  1447. for (; n < MAX_RECENTPLAYER_COUNT; n++)
  1448. {
  1449. if (m_pSelf->m_RecentPlayerName[n][0] == 0)
  1450. {
  1451. strncpy(m_pSelf->m_RecentPlayerName[n], szName, 32);
  1452. m_pSelf->m_nRecentPlayerName++;
  1453. return n + nChannelDataCount;
  1454. }
  1455. }
  1456. if (n >= MAX_RECENTPLAYER_COUNT)
  1457. {
  1458. memmove(m_pSelf->m_RecentPlayerName[0], m_pSelf->m_RecentPlayerName[1], sizeof(m_pSelf->m_RecentPlayerName) - 32);
  1459. n = MAX_RECENTPLAYER_COUNT - 1;
  1460. strncpy(m_pSelf->m_RecentPlayerName[n], szName, 32);
  1461. return n + nChannelDataCount;
  1462. }
  1463. return -1;
  1464. }
  1465. void KUiPlayerBar::ReplaceSpecialName(char* szDest, size_t nDestSize, char* szSrc)
  1466. {
  1467. KUiMsgCentrePad::ReplaceChannelName(szDest, nDestSize, szSrc);
  1468. }
  1469. bool KUiPlayerBar::GetExp(int& nFull, int& nCurrLevelExp, int& nCurrentExp)
  1470. {
  1471. if (m_pSelf)
  1472. {
  1473. nFull = m_pSelf->m_nExperienceFull;
  1474. nCurrLevelExp = m_pSelf->m_nCurLevelExperience;
  1475. nCurrentExp = m_pSelf->m_nExperience;
  1476. return true;
  1477. }
  1478. return false;
  1479. }
  1480. BOOL KUiPlayerBar::LoadPrivateSetting(KIniFile* pFile)
  1481. {
  1482. if (pFile && g_pCoreShell)
  1483. {
  1484. int nName = 0;
  1485. int nLife = 0;
  1486. int nPK = 0;
  1487. if (pFile->GetInteger("Player", "ShowLife", 0, (int*)(&nLife)))
  1488. g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_LIFE, 0, nLife);
  1489. if (pFile->GetInteger("Player", "ShowName", 0, (int*)(&nName)))
  1490. g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_NAME, 0, nName);
  1491. if (pFile->GetInteger("Player", "PK", 0, (int*)(&nPK)))
  1492. g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0, nPK);
  1493. }
  1494. return TRUE;
  1495. }
  1496. int KUiPlayerBar::SavePrivateSetting(KIniFile* pFile)
  1497. {
  1498. if (pFile && g_pCoreShell)
  1499. {
  1500. int nLife = g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_LIFE, 0, 0);
  1501. pFile->WriteInteger("Player", "ShowLife", nLife);
  1502. int nName = g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_NAME, 0, 0);
  1503. pFile->WriteInteger("Player", "ShowName", nName);
  1504. int nPK = g_pCoreShell->GetGameData(GDI_PK_SETTING, 0, 0);
  1505. pFile->WriteInteger("Player", "PK", nPK);
  1506. }
  1507. return 1;
  1508. }