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

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #define _RANGE_X 12
  3. #define _RANGE_Y 12
  4. #define _CACHE_TICK 500
  5. #define HEALTHFILLTICK 1500
  6. #define SPELLFILLTICK 800
  7. CMagicInfo* GetMagicInfo(int nMagicID);
  8. CMirMap* GetMap(char *pszMapName);
  9. CMonsterObject* AddCreature(CMirMap* pMap, int nX, int nY, int nMonRace, BOOL fSearch);
  10. CCharObject::CCharObject(CUserInfo* pUserInfo)
  11. // InitializeCriticalSection(&m_cs);
  12. m_pUserInfo = pUserInfo;
  13. m_nCurrX = 0;
  14. m_nCurrY = 0;
  15. ZeroMemory(m_szName, sizeof(m_szName));
  16. m_dwHealthTick = 0;
  17. m_dwSpellTick = 0;
  18. m_dwTickSec = 0;
  19. m_fOpenHealth = FALSE;
  20. m_nCharStatusEx = 0;
  21. m_nCharStatus = 0;
  22. m_IncHealing = 0;
  23. m_IncHealth = 0;
  24. m_IncSpell = 0;
  25. m_btPerHealing = 5;
  26. m_btPerHealth = 5;
  27. m_btPerSpell = 5;
  28. m_dwIncHealthSpellTime = 0;
  29. m_dwTickSec = GetTickCount();
  30. m_nEvent = -1; // No Event
  31. ZeroMemory(m_wStatusArr, sizeof(m_wStatusArr));
  32. ZeroMemory(m_szName, sizeof(m_szName));
  33. m_sHitSpeed = 0;
  34. m_fAbilMagBubbleDefence = FALSE;
  35. m_btMagBubbleDefenceLevel = 0;
  36. m_fInspector = FALSE;
  37. m_fFastTrain = FALSE;
  38. m_IncHealth = 0;
  39. m_IncSpell = 0;
  40. m_fIsGhost = FALSE;
  41. m_fIsNeverDie = FALSE;
  42. m_btSpeedPoint = DEFSPEED;
  43. m_fHumHideMode = FALSE;
  44. m_fFixedHideMode = FALSE;
  45. m_fStoneMode = FALSE;
  46. m_fStickMode = FALSE;
  47. m_pMasterObject = NULL;
  48. m_pTargetObject = NULL;
  49. }
  50. CCharObject::~CCharObject()
  51. {
  52. PLISTNODE pListNode = m_xVisibleObjectList.GetHead();
  53. while (pListNode)
  54. {
  55. CVisibleObject* pVisibleObject = m_xVisibleObjectList.GetData(pListNode);
  56. if (pVisibleObject) 
  57. {
  58. delete pVisibleObject;
  59. pVisibleObject = NULL;
  60. }
  61. pListNode = m_xVisibleObjectList.RemoveNode(pListNode);
  62. } // while (pListNode)
  63. // DeleteCriticalSection(&m_cs);
  64. }
  65. void CCharObject::SelectTarget(CCharObject* pTargetObject)
  66. {
  67. m_pTargetObject = pTargetObject;
  68. m_dwTargetFocusTime = GetTickCount();
  69. }
  70. void CCharObject::GetFrontPosition(int &nX, int &nY)
  71. {
  72. int nHeight = m_pMap->m_stMapFH.shHeight;
  73. int nWidth = m_pMap->m_stMapFH.shWidth;
  74. nX = m_nCurrX;
  75. nY = m_nCurrY;
  76. switch (m_nDirection)
  77. {
  78. case DR_UP:
  79. if (nY > 0) nY--;
  80. break;
  81. case DR_DOWN:
  82. if (nY < nHeight - 1) nY++;
  83. break;
  84. case DR_LEFT:
  85. if (nX > 0) nX--;
  86. break;
  87. case DR_RIGHT:
  88. if (nX < nWidth - 1) nX++;
  89. break;
  90. case DR_UPLEFT:
  91. {
  92.             if (nX > 0 && nY > 0)
  93. {
  94.                nX--;
  95.                nY--;
  96.             }
  97. break;
  98. }
  99. case DR_UPRIGHT:
  100. {
  101.             if (nX > 0 && nY < nHeight - 1)
  102. {
  103.                nX++;
  104.                nY--;
  105. }
  106. break;
  107. }
  108. case DR_DOWNLEFT:
  109. {
  110.             if (nX < nWidth - 1 && nY > 0)
  111. {
  112.                nX--;
  113.                nY++;
  114.             }
  115. break;
  116. }
  117. case DR_DOWNRIGHT:
  118. {
  119.             if (nX < nWidth - 1 && nY < nHeight - 1)
  120. {
  121.                nX++;
  122.                nY++;
  123.             }
  124. break;
  125. }
  126. }
  127. }
  128. int CCharObject::GetBack(int nDirection)
  129. {
  130. switch (nDirection)
  131. {
  132. case DR_UP:
  133. return DR_DOWN;
  134. case DR_DOWN:
  135. return DR_UP;
  136. case DR_LEFT:
  137. return DR_RIGHT;
  138. case DR_RIGHT:
  139. return DR_LEFT;
  140. case DR_UPLEFT:
  141. return DR_DOWNRIGHT;
  142. case DR_UPRIGHT:
  143. return DR_DOWNLEFT;
  144. case DR_DOWNLEFT:
  145. return DR_UPRIGHT;
  146. case DR_DOWNRIGHT:
  147. return DR_UPLEFT;
  148. }
  149. return nDirection;
  150. }
  151. BOOL CCharObject::GetBackPosition(int &nX, int &nY)
  152. {
  153. int nHeight = m_pMap->m_stMapFH.shHeight;
  154. int nWidth = m_pMap->m_stMapFH.shWidth;
  155. nX = m_nCurrX;
  156. nY = m_nCurrY;
  157. switch (m_nDirection)
  158. {
  159. case DR_UP:
  160. if (nY < nHeight - 1) nY++;
  161. break;
  162. case DR_DOWN:
  163. if (nY > 0) nY--;
  164. break;
  165. case DR_LEFT:
  166. if (nX < nWidth - 1) nX++;
  167. break;
  168. case DR_RIGHT:
  169. if (nX > 0) nX--;
  170. break;
  171. case DR_UPLEFT:
  172. if ((nX < nWidth - 1) && (nY < nHeight - 1))
  173. {
  174. nX++;
  175. nY++;
  176. }
  177. break;
  178. case DR_UPRIGHT:
  179. if ((nX < nWidth - 1) && (nY > 0))
  180. {
  181. nX--;
  182. nY++;
  183. }
  184. break;
  185. case DR_DOWNLEFT:
  186. if ((nX > 0) && (nY < nHeight - 1))
  187. {
  188. nX++;
  189. nY--;
  190. }
  191. break;
  192. case DR_DOWNRIGHT:
  193. if ((nX > 0) && (nY > 0))
  194. {
  195. nX--;
  196. nY--;
  197. }
  198. break;
  199. }
  200. return TRUE;
  201. }
  202. BOOL CCharObject::IsProperTarget(CCharObject* pTargetObject)
  203. {
  204. // if target.BoSysopMode or target.BoStoneMode then  //款康磊...
  205. //       Result := FALSE;
  206. return TRUE;
  207. }
  208. BOOL CCharObject::IsFriend(CCharObject* pCharObject)
  209. {
  210. if (pCharObject->m_wObjectType & _OBJECT_HUMAN)
  211. {
  212. if (pCharObject->m_pUserInfo)
  213. {
  214. switch (pCharObject->m_pUserInfo->GetAttackMode())
  215. {
  216. case HAM_ALL:
  217. return TRUE;
  218. case HAM_PEACE:
  219. return TRUE;
  220. }
  221. }
  222. }
  223. /*   function IsFriend (cret: TCreature): Boolean;
  224.    begin
  225.       Result := FALSE;
  226.       if cret.RaceServer = RC_USERHUMAN then begin  //措惑捞 荤恩牢 版快父
  227.          //傍拜屈怕 汲沥俊 蝶扼 促抚
  228.          case HumAttackMode of
  229.             HAM_ALL:  Result := TRUE;
  230.             HAM_PEACE: Result := TRUE;
  231.             HAM_GROUP:
  232.                begin
  233.                   if cret = self then
  234.                      Result := TRUE;
  235.                   if IsGroupMember (cret) then
  236.                      Result := TRUE;
  237.                end;
  238.             HAM_GUILD:
  239.                begin
  240.                   if cret = self then
  241.                      Result := TRUE;
  242.                   if MyGuild <> nil then begin
  243.                      if TGuild(MyGuild).IsMember(cret.UserName) then
  244.                         Result := TRUE;
  245.                      if BoGuildWarArea and (cret.MyGuild <> nil) then begin  //巩颇傈,傍己傈 瘤开俊 乐澜
  246.                         if TGuild(MyGuild).IsAllyGuild(TGuild(cret.MyGuild)) then
  247.                            Result := TRUE;
  248.                      end;
  249.                   end;
  250.                end;
  251.             HAM_PKATTACK:
  252.                begin
  253.                   if cret = self then Result := TRUE;
  254.                   if PKLevel >= 2 then begin //郴啊 弧盎捞
  255.                      if cret.PKLevel < 2 then Result := TRUE;
  256.                   end else begin  //郴啊 闰嫡捞
  257.                      if cret.PKLevel >= 2 then Result := TRUE;
  258.                   end;
  259.                end;
  260.          end;
  261.       end;
  262.    end;
  263. */
  264. return FALSE;
  265. }
  266. BOOL CCharObject::IsProperFriend(CCharObject* pCharObject)
  267. {
  268. BOOL fFlag = FALSE;
  269. if (pCharObject)
  270. {
  271. if (m_wObjectType & _OBJECT_ANIMAL)
  272. {
  273. if (pCharObject->m_wObjectType & _OBJECT_ANIMAL)
  274. fFlag = TRUE;
  275. if (pCharObject->m_pMasterObject)
  276. fFlag = FALSE;
  277. }
  278. else
  279. {
  280. if (m_wObjectType & _OBJECT_HUMAN)
  281. {
  282. fFlag = IsFriend(pCharObject);
  283. if (pCharObject->m_wObjectType & _OBJECT_ANIMAL)
  284. {
  285. if (pCharObject->m_pMasterObject == this)
  286. fFlag = TRUE;
  287. else if (pCharObject->m_pMasterObject)
  288. fFlag = IsFriend(pCharObject->m_pMasterObject);
  289. }
  290. }
  291. else
  292. fFlag = TRUE;
  293. }
  294. }
  295. return fFlag;
  296. }
  297. UINT CCharObject::GetCharStatus()
  298. {
  299. UINT s = 0;
  300. for (int i = 0; i < MAX_STATUS_ATTRIBUTE; i++)
  301. {
  302. if (m_wStatusArr[i] > 0)
  303. s |= (0x80000000 >> i);
  304. }
  305. return (s | (m_nCharStatusEx & 0x000FFFFF));
  306. }
  307. BOOL CCharObject::RestoreHealSpell()
  308. {
  309. if (m_fIsNeverDie)
  310. {
  311. m_WAbility.HP = m_WAbility.MaxHP;
  312. m_WAbility.MP = m_WAbility.MaxMP;
  313. }
  314. int n = (GetTickCount() - m_dwTickSec) / 20;  //檬寸 50
  315. m_dwTickSec = GetTickCount();
  316. m_dwHealthTick += n;
  317. m_dwSpellTick  += n;
  318. if (!m_fIsDead)
  319. {
  320. int nPlus = 0;
  321. BOOL  fHealthSpellChanged = FALSE;
  322. if (m_WAbility.HP < m_WAbility.MaxHP)
  323. {
  324.             if (m_dwHealthTick >= HEALTHFILLTICK)
  325. {
  326.                nPlus = m_WAbility.MaxHP / 15 + 1;
  327.                
  328. if (m_WAbility.HP + nPlus < m_WAbility.MaxHP)
  329. m_WAbility.HP = m_WAbility.HP + nPlus;
  330. else 
  331. m_WAbility.HP = m_WAbility.MaxHP;
  332. fHealthSpellChanged = TRUE;
  333.             }
  334. }
  335. if (m_WAbility.MP < m_WAbility.MaxMP)
  336. {
  337.             if (m_dwSpellTick >= SPELLFILLTICK)
  338. {
  339.                nPlus = m_WAbility.MaxMP / 18 + 1;
  340.                
  341. if (m_WAbility.MP + nPlus < m_WAbility.MaxMP)
  342. m_WAbility.MP = m_WAbility.MP + nPlus;
  343. else 
  344. m_WAbility.MP = m_WAbility.MaxMP;
  345. fHealthSpellChanged = TRUE;
  346.             }
  347. }
  348. if (m_WAbility.HP == 0)
  349. {
  350. return TRUE;
  351. }
  352. /*        if WAbil.HP = 0 then begin
  353.             if BoAbilRevival then begin //犁积 瓷仿捞 乐促.
  354.                if GetTickCount - LatestRevivalTime > 60 * 1000 then begin
  355.                   LatestRevivalTime := GetTickCount;
  356.                   //馆瘤甫 粹霸 茄促.
  357.                   ItemDamageRevivalRing;
  358.                   WAbil.HP := WAbil.MaxHP;
  359.                   HealthSpellChanged;
  360.                   SysMsg ('馆瘤狼 塞栏肺 个捞 犁积登菌嚼聪促.', 1);
  361.                end;
  362.             end;
  363.             if WAbil.HP = 0 then
  364.                Die;
  365.          end; */
  366. if (fHealthSpellChanged)
  367. HealthSpellChanged();
  368. if (m_dwHealthTick >= HEALTHFILLTICK)
  369. m_dwHealthTick = 0;
  370. if (m_dwSpellTick >= SPELLFILLTICK)
  371. m_dwSpellTick = 0;
  372. }
  373. else
  374. {
  375. if (GetTickCount() - m_dwDeathTime > 3 * 60 * 1000)
  376. MakeGhost();
  377. return FALSE;
  378. }
  379. if ((!m_fIsDead) && (m_IncSpell > 0) || (m_IncHealth > 0) || (m_IncHealing > 0))
  380. {
  381. int nHP = 0, nMP = 0;
  382. DWORD inchstime = 600 - _MIN(400, m_Ability.Level * 10);
  383. if (GetTickCount() - m_dwIncHealthSpellTime >= inchstime)
  384. {
  385. n = _MIN(200, (GetTickCount() - m_dwIncHealthSpellTime) - inchstime);
  386. m_dwIncHealthSpellTime = GetTickCount() + n;
  387. if ((m_IncSpell > 0) || (m_IncHealth > 0) || (m_IncHealing > 0))
  388. {
  389. if (m_btPerHealing <= 0) m_btPerHealing = 1;
  390. if (m_btPerSpell <= 0) m_btPerSpell = 1;
  391. if (m_btPerHealth <= 0) m_btPerHealth = 1;
  392. if (m_IncHealth < m_btPerHealth)
  393. {
  394. nHP += m_IncHealth;
  395. m_IncHealth = 0;
  396. }
  397. else
  398. {
  399. nHP += m_btPerHealth;
  400. m_IncHealth = m_IncHealth - m_btPerHealth;
  401. }
  402. if (m_IncSpell < m_btPerSpell)
  403. {
  404. nMP += m_IncSpell;
  405. m_IncSpell = 0;
  406. }
  407. else
  408. {
  409. nHP += m_btPerSpell;
  410. m_IncSpell = m_IncSpell - m_btPerSpell;
  411. }
  412. if (m_IncHealing < m_btPerHealing)
  413. {
  414. nHP += m_IncHealing;
  415. m_IncHealing = 0;
  416. }
  417. else
  418. {
  419. nHP += m_btPerHealing;
  420. m_IncHealing = m_IncHealing - m_btPerHealing;
  421. }
  422. }
  423. m_btPerHealing = 5;
  424. m_btPerHealth = 5 + (m_Ability.Level / 10);
  425. m_btPerSpell = 5 + (m_Ability.Level / 10);
  426. IncHealthSpell(nHP, nMP);
  427. if (m_WAbility.HP == m_WAbility.MaxHP)
  428. {
  429. m_IncHealth = 0;
  430. m_IncHealing = 0;
  431. }
  432. if (m_WAbility.MP == m_WAbility.MaxMP)
  433. m_IncSpell = 0;
  434. }
  435. }
  436. else
  437. m_dwIncHealthSpellTime = GetTickCount();
  438. if ((int)m_dwHealthTick < -HEALTHFILLTICK)
  439. {
  440. if (m_WAbility.HP > 1)
  441. {
  442. m_WAbility.HP--;
  443. m_dwHealthTick += HEALTHFILLTICK;
  444. HealthSpellChanged();
  445. }
  446. }
  447. return FALSE;
  448. }
  449. /*
  450. procedure TCreature.ScatterGolds;
  451. const
  452.    ONEDROP = 10000;
  453. var
  454.    i, ngold: integer;
  455. begin
  456.    if Gold > 0 then begin
  457.       for i:=0 to 8 do begin
  458.          if Gold > ONEDROP then begin
  459.             ngold := ONEDROP;
  460.             Gold := Gold - ONEDROP;
  461.          end else begin
  462.             ngold := Gold;
  463.             Gold := 0;
  464.          end;
  465.          if ngold > 0 then begin
  466.             if not DropGoldDown (ngold, TRUE) then begin
  467.                Gold := Gold + ngold;
  468.                break;
  469.             end;
  470.          end else break;
  471.       end;
  472.       GoldChanged;
  473.    end;
  474. end;
  475. */
  476. BOOL CCharObject::DropItemDown(_LPTUSERITEMRCD lpTItemRcd, int nRange, BOOL fIsGenItem)
  477. {
  478. CMapItem* xpMapItem = new CMapItem;
  479. xpMapItem->nCount = 1;
  480. if (fIsGenItem)
  481. {
  482. _LPTGENERALITEMRCD lpTGenItemRcd = NULL;
  483. lpTGenItemRcd = (_LPTGENERALITEMRCD)lpTItemRcd;
  484. xpMapItem->wLooks = (WORD)g_pStdItemEtc[lpTGenItemRcd->nStdIndex].dwLooks;
  485. xpMapItem->btAniCount = (BYTE)0;
  486. xpMapItem->pItem = (LONG)lpTGenItemRcd;
  487. memmove(xpMapItem->szName, g_pStdItemEtc[lpTGenItemRcd->nStdIndex].szName, memlen(g_pStdItemEtc[lpTGenItemRcd->nStdIndex].szName));
  488. }
  489. else
  490. {
  491. xpMapItem->wLooks = (WORD)g_pStdItemSpecial[lpTItemRcd->nStdIndex].dwLooks;
  492. xpMapItem->btAniCount = (BYTE)g_pStdItemSpecial[lpTItemRcd->nStdIndex].wAniCount;
  493. xpMapItem->pItem = (LONG)lpTItemRcd;
  494. if (strlen(lpTItemRcd->szPrefixName))
  495. {
  496. strcpy(xpMapItem->szName, lpTItemRcd->szPrefixName);
  497. strcat(xpMapItem->szName, " ");
  498. strcat(xpMapItem->szName, g_pStdItemSpecial[lpTItemRcd->nStdIndex].szName);
  499. }
  500. else
  501. strcpy(xpMapItem->szName, g_pStdItemSpecial[lpTItemRcd->nStdIndex].szName);
  502. }
  503. int nX, nY;
  504. m_pMap->GetDropPosition(m_nCurrX, m_nCurrY, nRange, nX, nY);
  505. m_pMap->AddNewObject(nX, nY, OS_ITEMOBJECT, (VOID *)xpMapItem);
  506. AddRefMsg(RM_ITEMSHOW, xpMapItem->wLooks, (int)xpMapItem, nX, nY, xpMapItem->szName);
  507. return TRUE;
  508. }
  509. /*
  510. function  TCreature.DropItemDown (ui: TUserItem; scatterrange: integer; diedrop: Boolean): Boolean;
  511. var
  512.    dx, dy, idura: integer;
  513.    pmi, pr: PTMapItem;
  514.    ps: PTStdItem;
  515.    logcap: string;
  516. begin
  517.    Result := FALSE;
  518.    ps := UserEngine.GetStdItem (ui.Index);
  519.    if ps <> nil then begin
  520.       if ps.StdMode = 40 then begin //绊扁甫 顶俊 冻绢哆赴 版快 绊扁 前龙捞 冻绢柳促.
  521.          idura := ui.Dura; //word捞骨肺.
  522.          idura := idura - 2000; //绊扁 前龙捞 冻绢柳促.
  523.          if idura < 0 then idura := 0;
  524.          ui.Dura := idura;
  525.       end;
  526.       new (pmi);
  527.       pmi.UserItem := ui;
  528.       pmi.Name := ps.Name;
  529.       pmi.Looks := ps.Looks;
  530.       if ps.StdMode = 45 then begin  //林荤困, 格犁
  531.          pmi.Looks := GetRandomLook (pmi.Looks, ps.Shape);
  532.       end;
  533.       pmi.AniCount := ps.AniCount;
  534.       pmi.Reserved := 0;
  535.       pmi.Count := 1;
  536.       GetDropPosition (CX, CY, scatterrange, dx, dy);
  537.       pr := Penvir.AddToMap (dx, dy, OS_ITEMOBJECT, TObject (pmi));  //茄伎俊 5俺 捞惑狼 酒捞袍捞 乐栏搁 角菩茄促.
  538.       if pr = pmi then begin
  539.          //酒捞袍篮 眠啊 酒聪搁 角菩..
  540.          SendRefMsg (RM_ITEMSHOW, pmi.Looks, integer(pmi), dx, dy, pmi.Name);
  541.          //冻绢哆覆
  542.          if diedrop then logcap := '冻崩_'
  543.          else logcap := '滚覆_';
  544.          if not IsCheapStuff (ps.StdMode) then
  545.             AddUserLog (logcap +
  546.                         MapName + '_' +
  547.                         IntToStr(CX) + '_' +
  548.                         IntToStr(CY) + '_' +
  549.                         BoolToStr(RaceServer = RC_USERHUMAN) + '_' +
  550.                         UserName + '_' +
  551.                         UserEngine.GetStdItemName (ui.Index) + '_' +
  552.                         IntToStr(ui.MakeIndex));
  553.          Result := TRUE;
  554.       end else begin
  555.          //角菩牢版快
  556.          Dispose (pmi);
  557.       end;
  558.    end;
  559. end;
  560. }
  561. */
  562. void CCharObject::Run()
  563. {
  564. if (m_fOpenHealth)
  565. {
  566. if (GetTickCount() - m_dwOpenHealthStart > m_dwOpenHealthTime)
  567. BreakOpenHealth();
  568. }
  569. BOOL fChg = FALSE;
  570. BOOL fNeedRecalc = FALSE;
  571. for (int i = 0; i < MAX_STATUS_ATTRIBUTE; i++)
  572. {
  573. if (m_wStatusArr[i] > 0 && m_wStatusArr[i] < 60000)
  574. {
  575. if (GetTickCount() - m_dwStatusTime[i] > 1000)
  576. {
  577. m_wStatusArr[i] -= 1;
  578. m_dwStatusTime[i] += 1000;
  579. if (m_wStatusArr[i] == 0)
  580. {
  581. fChg = TRUE;
  582. switch (i)
  583. {
  584. case STATE_DEFENCEUP:
  585. fNeedRecalc = TRUE;
  586. SysMsg("规绢仿 惑铰 秦力", 1);
  587. break;
  588.                         case STATE_MAGDEFENCEUP:
  589. fNeedRecalc = TRUE;
  590. SysMsg("付亲仿 惑铰 秦力", 1);
  591. break;
  592. /*                        case STATE_TRANSPARENT:
  593.                            begin
  594.                               BoHumHideMode := FALSE;
  595.                            end; */
  596.                         case STATE_BUBBLEDEFENCEUP:
  597. m_fAbilMagBubbleDefence = FALSE;
  598. break;
  599. }
  600. }
  601. }
  602. }
  603. }
  604. if (fChg)
  605. {
  606. m_nCharStatus = GetCharStatus();
  607. AddRefMsg(RM_CHARSTATUSCHANGED, m_sHitSpeed/*wparam*/, m_nCharStatus, 0, 0, NULL);
  608. }
  609. if (fNeedRecalc)
  610. {
  611. ((CPlayerObject*)this)->RecalcAbilitys();
  612. AddProcess(this, RM_ABILITY, 0, 0, 0, 0, NULL);
  613. }
  614. }
  615. void CCharObject::Die()
  616. {
  617. if (m_fIsNeverDie) return;
  618. m_IncHealing = 0;
  619. m_IncHealth = 0;
  620. m_IncSpell = 0;
  621. m_dwDeathTime = GetTickCount();
  622. if (m_wObjectType & (_OBJECT_ANIMAL | _OBJECT_HUMAN))
  623. AddRefMsg(RM_DEATH, m_nDirection, m_nCurrX, m_nCurrY, 1, NULL);
  624. m_fIsDead = TRUE;
  625. /*
  626.    try
  627.       boPK := FALSE;
  628.       if (not BoVentureServer) and (not PEnvir.FightZone) and (not PEnvir.Fight3Zone) then begin
  629.          //PK陛瘤 备开牢 版快
  630.          if (RaceServer = RC_USERHUMAN) and (LastHiter <> nil) and (PKLevel < 2) then begin
  631.             //磷篮磊啊 荤恩, 锭赴磊 乐澜, 磷篮磊啊 PK酒丛
  632.             if LastHiter.RaceServer = RC_USERHUMAN then
  633.                boPK := TRUE;
  634.             if LastHiter.Master <> nil then
  635.                if LastHiter.Master.RaceServer = RC_USERHUMAN then begin
  636.                   LastHiter := LastHiter.Master; //林牢捞 锭赴 巴栏肺 埃林
  637.                   boPK := TRUE;
  638.                end;
  639.          end;
  640.       end;
  641.       if boPK and (LastHiter <> nil) then begin
  642.          //荤恩捞 磷篮 版快, 葛氰辑滚俊辑绰 秦寸救凳
  643.          //荤恩捞 急樊茄 荤恩阑 磷烙.
  644.          //巩颇傈栏肺 磷澜
  645.          guildwarkill := FALSE;
  646.          if (MyGuild <> nil) and (LastHiter.MyGuild <> nil) then begin
  647.             //笛促 巩颇俊 啊涝等 惑怕俊辑
  648.             if GetGuildRelation (self, LastHiter) = 2 then  //巩颇傈 吝烙
  649.                guildwarkill := TRUE;  //巩颇傈栏肺 磷澜, 弧盎捞 救凳
  650.          end;
  651.          //傍己傈栏肺 磷澜
  652.          if UserCastle.BoCastleUnderAttack then
  653.             if (BoInFreePKArea) or (UserCastle.IsCastleWarArea (PEnvir, CX, CY)) then
  654.                guildwarkill := TRUE;
  655.          if not guildwarkill then begin //巩颇傈栏肺 磷澜
  656.             if not LastHiter.IsGoodKilling(self) then begin
  657.                LastHiter.IncPkPoint (100); //
  658.                LastHiter.SysMsg ('寸脚篮 混牢阑 窍看嚼聪促.', 0);
  659.                //混牢茄 荤恩 青款 皑家
  660.                LastHiter.AddBodyLuck (-500);
  661.                if PkLevel < 1 then //磷篮 荤恩捞 馒茄 荤恩
  662.                   if Random(5) = 0 then //混牢阑 窍搁 公扁啊 历林甫 罐绰促.
  663.                      LastHiter.MakeWeaponUnlock;
  664.             end else
  665.                LastHiter.SysMsg ('[沥寸规绢 痹蘑俊 狼秦 焊龋凳]', 1);
  666.          end;
  667.       end;
  668.    except
  669.       MainOutMessage ('[Exception] TCreature.Die 2');
  670.    end;
  671.    try
  672.       if (not PEnvir.FightZone) and
  673.          (not PEnvir.Fight3Zone) and
  674.          (not BoAnimal) then begin //悼拱捞搁 戒绢具 绊扁啊 唱柯促.
  675.          DropUseItems;
  676.          if (Master = nil) and (not BoNoItem) then
  677.             ScatterBagItems;  //林牢乐绰 各篮 拱扒阑 汝府瘤 臼澜
  678.          if (RaceServer >= RC_ANIMAL) and (Master = nil) and (not BoNoItem) then
  679.             ScatterGolds;
  680.          //磷篮 版快 青款摹 皑家
  681.          AddBodyLuck ( - (50 - (50 - Abil.Level * 5)));
  682.       end;
  683.       //巩颇 措傈 吝
  684.       if PEnvir.Fight3Zone then begin
  685.          //3锅 磷绢档 登绰 措访牢 版快
  686.          Inc (FightZoneDieCount);
  687.          if MyGuild <> nil then begin
  688.             TGuild(MyGuild).TeamFightWhoDead (UserName);
  689.          end;
  690.          //痢荐 拌魂
  691.          if (LastHiter <> nil) then begin
  692.             if (LastHiter.MyGuild <> nil) and (MyGuild <> nil) then begin
  693.                TGuild(LastHiter.MyGuild).TeamFightWhoWinPoint (LastHiter.UserName, 100);  //matchpoint 刘啊, 俺牢己利 扁废
  694.                str := TGuild(LastHiter.MyGuild).GuildName + ':' +
  695.                       IntToStr(TGuild(LastHiter.MyGuild).MatchPoint) + '  ' +
  696.                       TGuild(MyGuild).GuildName + ':' +
  697.                       IntToStr(TGuild(MyGuild).MatchPoint);
  698.                UserEngine.CryCry (RM_CRY, PEnvir, CX, CY, 10000, '- ' + str);  //泅甘 傈眉俊霸 舅赴促.
  699.             end;
  700.          end;
  701.       end;
  702.       //肺弊甫 巢变促.
  703.       if RaceServer = RC_USERHUMAN then begin
  704.          if LastHiter <> nil then begin
  705.             if LastHiter.RaceServer = RC_USERHUMAN then str := LastHiter.UserName
  706.             else str := '#' + LastHiter.UserName;
  707.          end else str := '####';
  708.          AddUserLog ('磷澜_' +
  709.                      MapName + '_' +
  710.                      IntToStr(CX) + '_' +
  711.                      IntToStr(CY) + '_' +
  712.                      UserName + '_' +
  713.                      str + '_' +
  714.                      'FZ-' + BoolToStr(PEnvir.FightZone) + '_' +
  715.                      'F3-' + BoolToStr(PEnvir.Fight3Zone));
  716.       end;
  717.       SendRefMsg (RM_DEATH, Dir, CX, CY, 1, '');
  718.    except
  719.       MainOutMessage ('[Exception] TCreature.Die 3');
  720.    end;
  721. end;
  722. */
  723. }
  724. BOOL CCharObject::GetAvailablePosition(CMirMap* pMap, int &nX, int &nY, int nRange)
  725. {
  726. if (pMap->CanMove(nX, nY))
  727. return TRUE;
  728. int nOrgX = nX;
  729. int nOrgY = nY;
  730. int nLoonCnt = (4 * nRange) * (nRange + 1);
  731. for (int i = 0; i < nLoonCnt; i++)
  732. {
  733. nX = nOrgX + g_SearchTable[i].x;
  734. nY = nOrgY + g_SearchTable[i].y;
  735. if (pMap->CanMove(nX, nY))
  736. return TRUE;
  737. }
  738. nX = nOrgX;
  739. nY = nOrgY;
  740. return FALSE;
  741. }
  742. BOOL CCharObject::GetNextPosition(int nSX, int nSY, int nDir, int nDistance, int& nX, int& nY)
  743. {
  744. nX = nSX;
  745. nY = nSY;
  746. switch (nDir)
  747. {
  748. case DR_UP:
  749. if (nY > (nDistance - 1)) nY -= nDistance;
  750. break;
  751. case DR_DOWN:
  752. if (nY < m_pMap->m_stMapFH.shHeight - nDistance) nY += nDistance;
  753. break;
  754. case DR_LEFT:
  755. if (nX > (nDistance - 1)) nX -= nDistance;
  756. break;
  757. case DR_RIGHT:
  758. if (nX < m_pMap->m_stMapFH.shWidth - nDistance) nX += nDistance;
  759. break;
  760. case DR_UPLEFT:
  761. {
  762. if ((nX > nDistance - 1) && (nY > nDistance - 1))
  763. {
  764. nX -= nDistance;
  765. nY -= nDistance;
  766. }
  767. break;
  768. }
  769. case DR_UPRIGHT:
  770. {
  771. if ((nX > nDistance - 1) && (nY < m_pMap->m_stMapFH.shHeight - nDistance))
  772. {
  773. nX += nDistance;
  774. nY -= nDistance;
  775. }
  776. break;
  777. }
  778. case DR_DOWNLEFT:
  779. {
  780. if ((nX < m_pMap->m_stMapFH.shWidth - nDistance) && (nY > nDistance - 1))
  781. {
  782. nX -= nDistance;
  783. nY += nDistance;
  784. }
  785. break;
  786. }
  787. case DR_DOWNRIGHT:
  788. {
  789. if ((nX < m_pMap->m_stMapFH.shWidth - nDistance) && (nY < m_pMap->m_stMapFH.shHeight - nDistance))
  790. {
  791. nX += nDistance;
  792. nY += nDistance;
  793. }
  794. break;
  795. }
  796. }
  797. if ((m_nCurrX == nX) && (m_nCurrY == nY))
  798. return FALSE;
  799. return TRUE;
  800. }
  801. int CCharObject::GetNextDirection(int nStartX, int nStartY, int nTargetX, int nTargetY)
  802. {
  803. int nFlagX, nFlagY;
  804. if (nStartX < nTargetX) nFlagX = 1;
  805. else if (nStartX == nTargetX) nFlagX = 0;
  806. else
  807. nFlagX = -1;
  808. if (abs(nStartY - nTargetY) > 2)
  809. {
  810. if ((nStartY >= nTargetY - 1) && (nStartY <= nTargetY + 1))
  811. nFlagX = 0;
  812. }
  813. if (nStartY < nTargetY) nFlagY = 1;
  814. else if (nStartY == nTargetY) nFlagY = 0;
  815. else
  816. nFlagY = -1;
  817. if (abs(nStartX - nTargetX) > 2)
  818. {
  819. if ((nStartX >= nTargetX - 1) && (nStartX <= nTargetX + 1))
  820. nFlagY = 0;
  821. }
  822. if ((nFlagX == 0) && (nFlagY == -1)) return DR_UP;
  823. else if ((nFlagX == 1) && (nFlagY == -1)) return DR_UPRIGHT;
  824. else if ((nFlagX == 1) && (nFlagY == 0)) return DR_RIGHT;
  825. else if ((nFlagX == 1) && (nFlagY == 1)) return DR_DOWNRIGHT;
  826. else if ((nFlagX == 0) && (nFlagY == 1)) return DR_DOWN;
  827. else if ((nFlagX == -1) && (nFlagY == 1)) return DR_DOWNLEFT;
  828. else if ((nFlagX == -1) && (nFlagY == 0)) return DR_LEFT;
  829. else if ((nFlagX == -1) && (nFlagY == -1)) return DR_UPLEFT;
  830. return DR_DOWN;
  831. }
  832. CCharObject* CCharObject::GetFrontObject()
  833. {
  834. int nX, nY;
  835. GetFrontPosition(nX, nY);
  836. CCharObject* pCharObject = m_pMap->GetObject(nX, nY);
  837. if (pCharObject)
  838. return pCharObject;
  839. return NULL;
  840. }
  841. void CCharObject::UpdateDelayProcessCheckParam1(CCharObject* pCharObject, WORD wIdent, WORD wParam, DWORD lParam1, DWORD lParam2, DWORD lParam3, char *pszData, int nDelay)
  842. {
  843. _LPTPROCESSMSG lpProcessMsg;
  844. int nCount = m_DelayProcessQ.GetCount();
  845. if (nCount)
  846. {
  847. for (int i = 0; i < nCount; i++)
  848. {
  849. lpProcessMsg = (_LPTPROCESSMSG)m_DelayProcessQ.PopQ();
  850. if (lpProcessMsg)
  851. {
  852. if (lpProcessMsg->wIdent == wIdent && lpProcessMsg->lParam1 == lParam1)
  853. {
  854. if (lpProcessMsg->pszData)
  855. {
  856. delete [] lpProcessMsg->pszData;
  857. lpProcessMsg->pszData = NULL;
  858. }
  859. delete lpProcessMsg;
  860. lpProcessMsg = NULL;
  861. }
  862. else
  863. m_DelayProcessQ.PushQ((BYTE *)lpProcessMsg);
  864. }
  865. }
  866. }
  867. AddDelayProcess(pCharObject, wIdent, wParam, lParam1, lParam2, lParam3, pszData, nDelay);
  868. }
  869. void CCharObject::UpdateProcess(CCharObject* pCharObject, WORD wIdent, WORD wParam, DWORD lParam1, DWORD lParam2, DWORD lParam3, char *pszData)
  870. {
  871. _LPTPROCESSMSG lpProcessMsg;
  872. // EnterCriticalSection(&m_cs);
  873. int nCount = m_ProcessQ.GetCount();
  874. if (nCount)
  875. {
  876. for (int i = 0; i < nCount; i++)
  877. {
  878. lpProcessMsg = (_LPTPROCESSMSG)m_ProcessQ.PopQ();
  879. if (lpProcessMsg)
  880. {
  881. if (lpProcessMsg->wIdent == wIdent)
  882. {
  883. if (lpProcessMsg->pszData)
  884. {
  885. delete [] lpProcessMsg->pszData;
  886. lpProcessMsg->pszData = NULL;
  887. }
  888. delete lpProcessMsg;
  889. lpProcessMsg = NULL;
  890. }
  891. else
  892. m_ProcessQ.PushQ((BYTE *)lpProcessMsg);
  893. }
  894. }
  895. }
  896. // LeaveCriticalSection(&m_cs);
  897. AddProcess(pCharObject, wIdent, wParam, lParam1, lParam2, lParam3, pszData);
  898. }
  899. void CCharObject::AddProcess(CCharObject* pCharObject, WORD wIdent, WORD wParam, DWORD lParam1, DWORD lParam2, DWORD lParam3, char *pszData)
  900. {
  901. // EnterCriticalSection(&m_cs);
  902. _LPTPROCESSMSG lpProcessMsg = new _TPROCESSMSG;
  903. if (!m_fIsGhost)
  904. {
  905. if (lpProcessMsg)
  906. {
  907. lpProcessMsg->wIdent = wIdent;
  908. lpProcessMsg->wParam = wParam;
  909. lpProcessMsg->lParam1 = lParam1;
  910. lpProcessMsg->lParam2 = lParam2;
  911. lpProcessMsg->lParam3 = lParam3;
  912. lpProcessMsg->dwDeliveryTime = 0;
  913. lpProcessMsg->pCharObject = pCharObject;
  914. if (pszData)
  915. {
  916. int nLen = memlen(pszData);
  917. lpProcessMsg->pszData = new char[nLen];
  918. memmove(lpProcessMsg->pszData, pszData, nLen);
  919. }
  920. else
  921. lpProcessMsg->pszData = NULL;
  922. m_ProcessQ.PushQ((BYTE *)lpProcessMsg);
  923. }
  924. }
  925. // LeaveCriticalSection(&m_cs);
  926. }
  927. void CCharObject::AddDelayProcess(CCharObject* pCharObject, WORD wIdent, WORD wParam, DWORD lParam1, DWORD lParam2, DWORD lParam3, char *pszData, int nDelay)
  928. {
  929. // EnterCriticalSection(&m_cs);
  930. _LPTPROCESSMSG lpProcessMsg = new _TPROCESSMSG;
  931. if (lpProcessMsg)
  932. {
  933. lpProcessMsg->wIdent = wIdent;
  934. lpProcessMsg->wParam = wParam;
  935. lpProcessMsg->lParam1 = lParam1;
  936. lpProcessMsg->lParam2 = lParam2;
  937. lpProcessMsg->lParam3 = lParam3;
  938. lpProcessMsg->dwDeliveryTime = GetTickCount() + nDelay;
  939. lpProcessMsg->pCharObject = pCharObject;
  940. if (pszData)
  941. {
  942. int nLen = memlen(pszData);
  943. lpProcessMsg->pszData = new char[nLen];
  944. memmove(lpProcessMsg->pszData, pszData, nLen);
  945. }
  946. else
  947. lpProcessMsg->pszData = NULL;
  948. m_DelayProcessQ.PushQ((BYTE *)lpProcessMsg);
  949. }
  950. // LeaveCriticalSection(&m_cs);
  951. }
  952. void CCharObject::AddRefMsg(WORD wIdent, WORD wParam, DWORD lParam1, DWORD lParam2, DWORD lParam3, char *pszData)
  953. {
  954. CMapCellInfo* pMapCellInfo = NULL;
  955. CCharObject* pCharObject = NULL;
  956. int nStartX = m_nCurrX - _RANGE_X;
  957. int nEndX = m_nCurrX + _RANGE_X;
  958. int nStartY = m_nCurrY - _RANGE_Y;
  959. int nEndY = m_nCurrY + _RANGE_Y;
  960. if (m_fInspector) return;
  961. if (GetTickCount() - m_dwCacheTick > _CACHE_TICK || m_xCacheObjectList.GetCount() == 0)
  962. {
  963. m_xCacheObjectList.Clear();
  964. for (int x = nStartX; x <= nEndX; x++)
  965. {
  966. for (int y = nStartY; y <= nEndY; y++)
  967. {
  968. if (pMapCellInfo = m_pMap->GetMapCellInfo(x, y))
  969. {
  970. if (pMapCellInfo->m_xpObjectList)
  971. {
  972. if (pMapCellInfo->m_xpObjectList->GetCount())
  973. {
  974. PLISTNODE pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  975. while (pListNode)
  976. {
  977. _LPTOSOBJECT pOSObject = pMapCellInfo->m_xpObjectList->GetData(pListNode);
  978. if (pOSObject->btType == OS_MOVINGOBJECT)
  979. {
  980. pCharObject = (CCharObject*)pOSObject->pObject;
  981. if (!pCharObject->m_fIsGhost)
  982. {
  983. if (pCharObject->m_wObjectType & _OBJECT_HUMAN)
  984. {
  985. pCharObject->AddProcess(this, wIdent, wParam, lParam1, lParam2, lParam3, pszData);
  986. m_xCacheObjectList.AddNewNode(pCharObject);
  987. }
  988. }
  989. }
  990. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  991. } // while (pListNode)
  992. } // if (pMapCellInfo->m_pObjectList.GetCount())
  993. }
  994. } // if (pMapCellInfo)
  995. }// for (y)
  996. } // for (x)
  997. m_dwCacheTick = GetTickCount();
  998. }
  999. else
  1000. {
  1001. PLISTNODE pListNode = m_xCacheObjectList.GetHead();
  1002. while (pListNode)
  1003. {
  1004. CCharObject* pCharObject = m_xCacheObjectList.GetData(pListNode);
  1005. if (!pCharObject->m_fIsGhost)
  1006. {
  1007. if ((pCharObject->m_pMap = m_pMap) && (abs(pCharObject->m_nCurrX - m_nCurrX) <= 11) && 
  1008. (abs(pCharObject->m_nCurrY - m_nCurrY) <= 11))
  1009. {
  1010. if (pCharObject->m_wObjectType & _OBJECT_HUMAN)
  1011. pCharObject->AddProcess(this, wIdent, wParam, lParam1, lParam2, lParam3, pszData);
  1012. //                     end else begin
  1013. //                      if cret.WantRefMsg and ((msg = RM_STRUCK) or (msg = RM_HEAR) or (msg = RM_DEATH)) then
  1014. //                       cret.SendMsg (self, msg, wparam, lparam1, lparam2, lparam3, str);
  1015. }
  1016. }
  1017. pListNode = m_xCacheObjectList.GetNext(pListNode);
  1018. } // while (pListNode)
  1019. }
  1020. }
  1021. void CCharObject::SpaceMove(int nX, int nY, CMirMap* pMirMap)
  1022. {
  1023. CVisibleObject* pVisibleObject;
  1024. if (m_pMap->RemoveObject(m_nCurrX, m_nCurrY, OS_MOVINGOBJECT, this))
  1025. {
  1026. PLISTNODE pListNode = m_xVisibleObjectList.GetHead();
  1027. while (pListNode)
  1028. {
  1029. pVisibleObject = m_xVisibleObjectList.GetData(pListNode);
  1030. if (pVisibleObject)
  1031. {
  1032. delete pVisibleObject;
  1033. pVisibleObject = NULL;
  1034. }
  1035. pListNode = m_xVisibleObjectList.RemoveNode(pListNode);
  1036. } // while (pListNode)
  1037. m_pMap = pMirMap;
  1038. m_nCurrX = nX;
  1039. m_nCurrY = nY;
  1040. if (m_pMap->AddNewObject(m_nCurrX, m_nCurrY, OS_MOVINGOBJECT, this))
  1041. {
  1042. AddProcess(this, RM_CLEAROBJECTS, 0, 0, 0, 0, NULL);
  1043. AddProcess(this, RM_CHANGEMAP, 0, 0, 0, 0, NULL);
  1044. AddRefMsg(RM_SPACEMOVE_SHOW, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
  1045. }
  1046. }
  1047. }
  1048. void CCharObject::UpdateVisibleObject(CCharObject* pCharObject)
  1049. {
  1050. CVisibleObject* pVisibleObject;
  1051. PLISTNODE pListNode = m_xVisibleObjectList.GetHead();
  1052. while (pListNode)
  1053. {
  1054. pVisibleObject = m_xVisibleObjectList.GetData(pListNode);
  1055. if (pVisibleObject->pObject == pCharObject)
  1056. {
  1057. pVisibleObject->nVisibleFlag = 1;
  1058. return;
  1059. }
  1060. pListNode = m_xVisibleObjectList.GetNext(pListNode);
  1061. } // while (pListNode)
  1062. CVisibleObject* pNewVisibleObject = new CVisibleObject;
  1063. pNewVisibleObject->nVisibleFlag = 2;
  1064. pNewVisibleObject->pObject = pCharObject;
  1065. m_xVisibleObjectList.AddNewNode(pNewVisibleObject);
  1066. }
  1067. void CCharObject::UpdateVisibleItem(int nX, int nY, CMapItem* pMapItem)
  1068. {
  1069. CVisibleMapItem* pVisibleItem;
  1070. PLISTNODE pListNode = m_xVisibleItemList.GetHead();
  1071. while (pListNode)
  1072. {
  1073. pVisibleItem = m_xVisibleItemList.GetData(pListNode);
  1074. if (pVisibleItem->pMapItem == pMapItem)
  1075. {
  1076. pVisibleItem->nVisibleFlag = 1;
  1077. return;
  1078. }
  1079. pListNode = m_xVisibleItemList.GetNext(pListNode);
  1080. } // while (pListNode)
  1081. CVisibleMapItem* pVisibleNewItem = new CVisibleMapItem;
  1082. pVisibleNewItem->nVisibleFlag = 2;
  1083. pVisibleNewItem->wX = (WORD)nX;
  1084. pVisibleNewItem->wY = (WORD)nY;
  1085. pVisibleNewItem->pMapItem = pMapItem;
  1086. m_xVisibleItemList.AddNewNode(pVisibleNewItem);
  1087. }
  1088. void CCharObject::UpdateVisibleEvent(CEvent* pEvent)
  1089. {
  1090. CVisibleEvent* pVisibleEvent;
  1091. PLISTNODE pListNode = m_xVisibleEventList.GetHead();
  1092. while (pListNode)
  1093. {
  1094. pVisibleEvent = m_xVisibleEventList.GetData(pListNode);
  1095. if (pVisibleEvent->pEvent == pEvent)
  1096. {
  1097. pVisibleEvent->nVisibleFlag = 1;
  1098. return;
  1099. }
  1100. pListNode = m_xVisibleEventList.GetNext(pListNode);
  1101. } // while (pListNode)
  1102. CVisibleEvent* pVisibleNewEvent = new CVisibleEvent;
  1103. pVisibleNewEvent->nVisibleFlag = 2;
  1104. pVisibleNewEvent->pEvent = pEvent;
  1105. m_xVisibleEventList.AddNewNode(pVisibleNewEvent);
  1106. }
  1107. void CCharObject::SearchViewRange()
  1108. {
  1109. int nStartX = m_nCurrX - m_nViewRange;
  1110. int nEndX = m_nCurrX + m_nViewRange;
  1111. int nStartY = m_nCurrY - m_nViewRange;
  1112. int nEndY = m_nCurrY + m_nViewRange;
  1113. CMapCellInfo* pMapCellInfo;
  1114. _LPTOSOBJECT pOSObject;
  1115. CCharObject* pCharObject;
  1116. CEvent* pEvent;
  1117. PLISTNODE pListNode;
  1118. CVisibleObject* pVisibleObject;
  1119. CVisibleMapItem* pVisibleItem;
  1120. CVisibleEvent* pVisibleEvent;
  1121. // Clear VisibleObjectList
  1122. if (m_xVisibleObjectList.GetCount())
  1123. {
  1124. pListNode = m_xVisibleObjectList.GetHead();
  1125. while (pListNode)
  1126. {
  1127. if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
  1128. pVisibleObject->nVisibleFlag = 0;
  1129. pListNode = m_xVisibleObjectList.GetNext(pListNode);
  1130. }
  1131. }
  1132. // Clear VisibleMapItem
  1133. if (m_xVisibleItemList.GetCount())
  1134. {
  1135. pListNode = m_xVisibleItemList.GetHead();
  1136. while (pListNode)
  1137. {
  1138. if (pVisibleItem = m_xVisibleItemList.GetData(pListNode))
  1139. pVisibleItem->nVisibleFlag = 0;
  1140. pListNode = m_xVisibleItemList.GetNext(pListNode);
  1141. }
  1142. }
  1143. // Clear VisibleEvent
  1144. if (m_xVisibleEventList.GetCount())
  1145. {
  1146. pListNode = m_xVisibleEventList.GetHead();
  1147. while (pListNode)
  1148. {
  1149. if (pVisibleEvent = m_xVisibleEventList.GetData(pListNode))
  1150. pVisibleEvent->nVisibleFlag = 0;
  1151. pListNode = m_xVisibleEventList.GetNext(pListNode);
  1152. }
  1153. }
  1154. // Search VisibleAllObjectList
  1155. for (int x = nStartX; x <= nEndX; x++)
  1156. {
  1157. for (int y = nStartY; y <= nEndY; y++)
  1158. {
  1159. pMapCellInfo = m_pMap->GetMapCellInfo(x, y);
  1160. if (pMapCellInfo)
  1161. {
  1162. if (pMapCellInfo->m_xpObjectList)
  1163. {
  1164. if (pMapCellInfo->m_xpObjectList->GetCount())
  1165. {
  1166. pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  1167. while (pListNode)
  1168. {
  1169. pOSObject = pMapCellInfo->m_xpObjectList->GetData(pListNode);
  1170. if (pOSObject)
  1171. {
  1172. if (pOSObject->btType == OS_MOVINGOBJECT)
  1173. {
  1174. pCharObject = (CCharObject*)pOSObject->pObject;
  1175. if (!pCharObject->m_fInspector && !pCharObject->m_fIsGhost && !pCharObject->m_fHideMode)
  1176. UpdateVisibleObject(pCharObject);
  1177. }
  1178. else if (pOSObject->btType == OS_ITEMOBJECT)
  1179. {
  1180. if (GetTickCount() - pOSObject->dwAddTime > 60 * 60 * 1000)
  1181. {
  1182. delete pOSObject;
  1183. pOSObject = NULL;
  1184. pListNode = pMapCellInfo->m_xpObjectList->RemoveNode(pListNode);
  1185. continue;
  1186. }
  1187. else
  1188. UpdateVisibleItem(x, y, (CMapItem*)pOSObject->pObject);
  1189. }
  1190. else if (pOSObject->btType == OS_EVENTOBJECT)
  1191. {
  1192. pEvent = (CEvent*)pOSObject->pObject;
  1193. if (pEvent->m_fVisible)
  1194. UpdateVisibleEvent(pEvent);
  1195. }
  1196. }
  1197. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  1198. } // while (pListNode)
  1199. } // if (pMapCellInfo->m_pObjectList.GetCount())
  1200. }
  1201. } // if (pMapCellInfo)
  1202. }// for (y)
  1203. } // for (x)
  1204. if (m_xVisibleObjectList.GetCount())
  1205. {
  1206. pListNode = m_xVisibleObjectList.GetHead();
  1207. while (pListNode)
  1208. {
  1209. if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
  1210. {
  1211. if (pVisibleObject->nVisibleFlag == 0)
  1212. {
  1213. if (!pVisibleObject->pObject->m_fHideMode)
  1214. AddProcess(pVisibleObject->pObject, RM_DISAPPEAR, 0, 0, 0, 0, NULL);
  1215. delete pVisibleObject;
  1216. pVisibleObject = NULL;
  1217. pListNode = m_xVisibleObjectList.RemoveNode(pListNode);
  1218. continue;
  1219. }
  1220. else
  1221. {
  1222. if (m_wObjectType & _OBJECT_HUMAN)
  1223. {
  1224. if (pVisibleObject->nVisibleFlag == 2) // 2:New Object
  1225. {
  1226. if (pVisibleObject->pObject != this)
  1227. {
  1228. if (pVisibleObject->pObject->m_fIsDead)
  1229. {
  1230. AddProcess(pVisibleObject->pObject, RM_DEATH, pVisibleObject->pObject->m_nDirection, 
  1231. pVisibleObject->pObject->m_nCurrX, pVisibleObject->pObject->m_nCurrY, 0, NULL);
  1232. }
  1233. else
  1234. AddProcess(pVisibleObject->pObject, RM_TURN, pVisibleObject->pObject->m_nDirection, 
  1235. pVisibleObject->pObject->m_nCurrX, pVisibleObject->pObject->m_nCurrY, 
  1236. 0, pVisibleObject->pObject->m_szName);
  1237. }
  1238. }
  1239. }
  1240. } // if (pVisibleObject->nVisibleFlag == 0)
  1241. } // if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
  1242. pListNode = m_xVisibleObjectList.GetNext(pListNode);
  1243. } // while (pListNode)
  1244. }
  1245. // Update Map Item
  1246. if (m_xVisibleItemList.GetCount())
  1247. {
  1248. pListNode = m_xVisibleItemList.GetHead();
  1249. while (pListNode)
  1250. {
  1251. if (pVisibleItem = m_xVisibleItemList.GetData(pListNode))
  1252. {
  1253. if (pVisibleItem->nVisibleFlag == 0)
  1254. {
  1255. AddProcess(this, RM_ITEMHIDE, 0, (LPARAM)pVisibleItem->pMapItem, pVisibleItem->wX, pVisibleItem->wY, NULL);
  1256. delete pVisibleItem;
  1257. pVisibleItem = NULL;
  1258. pListNode = m_xVisibleItemList.RemoveNode(pListNode);
  1259. continue;
  1260. }
  1261. else
  1262. {
  1263. if (pVisibleItem->nVisibleFlag == 2) // 2:New Item
  1264. AddProcess(this, RM_ITEMSHOW, pVisibleItem->pMapItem->wLooks, (LPARAM)pVisibleItem->pMapItem, 
  1265. pVisibleItem->wX, pVisibleItem->wY, pVisibleItem->pMapItem->szName);
  1266. } // if (pVisibleObject->nVisibleFlag == 0)
  1267. } // if (pVisibleObject = m_xVisibleItemList.GetData(pListNode))
  1268. pListNode = m_xVisibleItemList.GetNext(pListNode);
  1269. } // while (pListNode)
  1270. }
  1271. // Update Event Item
  1272. if (m_xVisibleEventList.GetCount())
  1273. {
  1274. pListNode = m_xVisibleEventList.GetHead();
  1275. while (pListNode)
  1276. {
  1277. if (pVisibleEvent = m_xVisibleEventList.GetData(pListNode))
  1278. {
  1279. if (pVisibleEvent->nVisibleFlag == 0)
  1280. {
  1281. AddProcess(this, RM_HIDEEVENT, 0, (LPARAM)pVisibleEvent->pEvent, pVisibleEvent->pEvent->m_nX, pVisibleEvent->pEvent->m_nY);
  1282. pListNode = m_xVisibleEventList.RemoveNode(pListNode);
  1283. delete pVisibleEvent;
  1284. pVisibleEvent = NULL;
  1285. continue;
  1286. }
  1287. else if (pVisibleEvent->nVisibleFlag == 2) 
  1288. {
  1289. AddProcess(this, RM_SHOWEVENT, pVisibleEvent->pEvent->m_nEventType, (LPARAM)pVisibleEvent->pEvent, 
  1290. MAKELONG(pVisibleEvent->pEvent->m_nX, pVisibleEvent->pEvent->m_nEventParam), pVisibleEvent->pEvent->m_nY);
  1291. }
  1292. }
  1293. pListNode = m_xVisibleEventList.GetNext(pListNode);
  1294. } // while (pListNode)
  1295. }
  1296. }
  1297. void CCharObject::Disappear()
  1298. {
  1299. if (m_pMap)
  1300. {
  1301. m_pMap->RemoveObject(m_nCurrX, m_nCurrY, OS_MOVINGOBJECT, this);
  1302. AddRefMsg(RM_DISAPPEAR, 0, 0, 0, 0, NULL);
  1303. }
  1304. }
  1305. void CCharObject::MakeGhost()
  1306. {
  1307. m_fIsGhost = TRUE;
  1308. m_dwGhostTime = GetTickCount();
  1309.    
  1310. Disappear();
  1311. }
  1312. void CCharObject::TurnTo(int nDir)
  1313. {
  1314. AddRefMsg(RM_TURN, nDir, m_nCurrX, m_nCurrY, 0, m_szName);
  1315. m_nDirection = nDir;
  1316. }
  1317. BOOL CCharObject::TurnXY(int nX, int nY, int nDir)
  1318. {
  1319. if (m_nCurrX == nX && m_nCurrY == nY)
  1320. {
  1321. AddRefMsg(RM_TURN, nDir, m_nCurrX, m_nCurrY, 0, m_szName);
  1322. m_nDirection = nDir;
  1323. return TRUE;
  1324. }
  1325. return FALSE;
  1326. }
  1327. void CCharObject::WalkNextPos(int nDir, int& nX, int& nY)
  1328. {
  1329. switch (nDir)
  1330. {
  1331. case DR_UP:
  1332. nX = m_nCurrX;
  1333. nY = m_nCurrY - 1;
  1334. break;
  1335. case DR_UPRIGHT:
  1336. nX = m_nCurrX + 1;
  1337. nY = m_nCurrY - 1;
  1338. break;
  1339. case DR_RIGHT:
  1340. nX = m_nCurrX + 1;
  1341. nY = m_nCurrY;
  1342. break;
  1343. case DR_DOWNRIGHT:
  1344. nX = m_nCurrX + 1;
  1345. nY = m_nCurrY + 1;
  1346. break;
  1347. case DR_DOWN:
  1348. nX = m_nCurrX;
  1349. nY = m_nCurrY + 1;
  1350. break;
  1351. case DR_DOWNLEFT:
  1352. nX = m_nCurrX - 1;
  1353. nY = m_nCurrY + 1;
  1354. break;
  1355. case DR_LEFT:
  1356. nX = m_nCurrX - 1;
  1357. nY = m_nCurrY;
  1358. break;
  1359. case DR_UPLEFT:
  1360. nX = m_nCurrX - 1;
  1361. nY = m_nCurrY - 1;
  1362. break;
  1363. }
  1364. }
  1365. BOOL CCharObject::WalkTo(int nDir)
  1366. {
  1367. int nX, nY;
  1368. WalkNextPos(nDir, nX, nY);
  1369. BOOL fResult = WalkXY(nX, nY, nDir);
  1370. if (fResult)
  1371. {
  1372. if (m_fFixedHideMode)
  1373. {
  1374.            if (m_fHumHideMode)
  1375.               m_wStatusArr[STATE_TRANSPARENT] = 1;
  1376. }
  1377. }
  1378. return fResult;
  1379. }
  1380. BOOL CCharObject::RunTo(int nDir)
  1381. {
  1382. int nX = m_nCurrX, nY = m_nCurrY;
  1383. int nWalk = 2;
  1384. if (m_tFeatureEx.btHorse)
  1385. nWalk = 3;
  1386. for (int i = 0; i < nWalk; i++)
  1387. {
  1388. switch (nDir)
  1389. {
  1390. case DR_UP:
  1391. nY--;
  1392. break;
  1393. case DR_UPRIGHT:
  1394. nX++;
  1395. nY--;
  1396. break;
  1397. case DR_RIGHT:
  1398. nX++;
  1399. break;
  1400. case DR_DOWNRIGHT:
  1401. nX++;
  1402. nY++;
  1403. break;
  1404. case DR_DOWN:
  1405. nY++;
  1406. break;
  1407. case DR_DOWNLEFT:
  1408. nX--;
  1409. nY++;
  1410. break;
  1411. case DR_LEFT:
  1412. nX--;
  1413. break;
  1414. case DR_UPLEFT:
  1415. nX--;
  1416. nY--;
  1417. break;
  1418. }
  1419. if (m_pMap->CanMove(nX, nY) == FALSE)
  1420. return FALSE;
  1421. }
  1422. return RunXY(nX, nY, nDir); 
  1423. }
  1424. BOOL CCharObject::WalkXY(int nX, int nY, int nDir)
  1425. {
  1426. int nFlag = m_pMap->CheckDoorEvent(nX, nY, m_nEvent);
  1427. if (nFlag)
  1428. {
  1429. if (nFlag == _DOOR_OPEN)
  1430. AddRefMsg(RM_DOOROPEN, 1, m_nEvent, 0, 0, NULL);
  1431. }
  1432. if (m_pMap->CanMove(nX, nY))
  1433. {
  1434. if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nX, nY, this))
  1435. {
  1436. //#ifdef _DEBUG
  1437. // _RPT4(_CRT_WARN, "WALK:%d, %d -> %d, %d", m_nCurrX, m_nCurrY, nX, nY);
  1438. // _RPT1(_CRT_WARN, " [%d]n", nDir); 
  1439. //#endif
  1440. AddRefMsg(RM_WALK, nDir, m_nCurrX, m_nCurrY, 0, NULL);
  1441. m_nCurrX = nX;
  1442. m_nCurrY = nY;
  1443. m_nDirection = nDir;
  1444. m_dwHealthTick -= 20;
  1445. return TRUE;
  1446. }
  1447. }
  1448. return FALSE;
  1449. }
  1450. BOOL CCharObject::RunXY(int nX, int nY, int nDir)
  1451. {
  1452. if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nX, nY, this))
  1453. {
  1454. //#ifdef _DEBUG
  1455. // _RPT4(_CRT_WARN, "RUN:%d, %d -> %d, %d", m_nCurrX, m_nCurrY, nX, nY);
  1456. // _RPT1(_CRT_WARN, " [%d]n", nDir); 
  1457. //#endif
  1458. AddRefMsg(RM_RUN, nDir, m_nCurrX, m_nCurrY, 0, NULL);
  1459. m_nCurrX = nX;
  1460. m_nCurrY = nY;
  1461. m_nDirection = nDir;
  1462. m_dwHealthTick -= 150;
  1463. m_dwSpellTick -= 10;
  1464. m_dwSpellTick = _MAX(0, m_dwSpellTick);
  1465. m_btPerHealth--;
  1466. m_btPerSpell--;
  1467. return TRUE;
  1468. }
  1469. return FALSE;
  1470. }
  1471. void CCharObject::IncHealthSpell(int nHP, int nMP)
  1472. {
  1473. if (nHP >= 0)
  1474. {
  1475. if (m_WAbility.HP + nHP < m_WAbility.MaxHP)
  1476. m_WAbility.HP += nHP;
  1477. else 
  1478. m_WAbility.HP = m_WAbility.MaxHP;
  1479. }
  1480. if (nMP >= 0)
  1481. {
  1482. if (m_WAbility.MP + nMP < m_WAbility.MaxMP)
  1483. m_WAbility.MP += nMP;
  1484. else 
  1485. m_WAbility.MP = m_WAbility.MaxMP;
  1486. }
  1487. HealthSpellChanged();
  1488. }
  1489. //val : (+) dec spell
  1490. //      (-) inc spell
  1491. void CCharObject::DamageSpell(int nVal)
  1492. {
  1493. if (nVal > 0)
  1494. {
  1495. if (m_WAbility.MP - nVal > 0)
  1496. m_WAbility.MP = m_WAbility.MP - nVal;
  1497. else
  1498. m_WAbility.MP = 0;
  1499. }
  1500. else
  1501. {
  1502. if (m_WAbility.MP - nVal < m_WAbility.MaxMP)
  1503. m_WAbility.MP = m_WAbility.MP - nVal;
  1504. else
  1505. m_WAbility.MP = m_WAbility.MaxMP;
  1506. }
  1507. }
  1508. //nDamage : if (+) damage health
  1509. // if (-) healing health
  1510. void CCharObject::DamageHealth(int nDamage)
  1511. {
  1512. /*  焊龋狼馆瘤 
  1513. if BoMagicShield and (damage > 0) and (WAbil.MP > 0) then begin
  1514.       spdam := Round (damage * 1.5);
  1515.       if integer(WAbil.MP) >= spdam then begin
  1516.          WAbil.MP := WAbil.MP - spdam;
  1517.          spdam := 0;
  1518.       end else begin
  1519.          spdam := spdam - WAbil.MP;
  1520.          WAbil.MP := 0;
  1521.       end;
  1522.       damage := Round (spdam / 1.5);
  1523.       HealthSpellChanged;
  1524.    end; */
  1525. if (nDamage > 0)
  1526. {
  1527. if (m_WAbility.HP - nDamage > 0)
  1528. m_WAbility.HP = m_WAbility.HP - nDamage;
  1529. else
  1530. m_WAbility.HP = 0;
  1531. }
  1532. else
  1533. {
  1534. if (m_WAbility.HP - nDamage < m_WAbility.MaxHP)
  1535. m_WAbility.HP = m_WAbility.HP - nDamage;
  1536. else
  1537. m_WAbility.HP = m_WAbility.MaxHP;
  1538. }
  1539. }
  1540. int CCharObject::GetMagStruckDamage(int nDamage)
  1541. {
  1542. int nArmor = 0;
  1543. if ((HIBYTE(m_WAbility.MAC) - LOBYTE(m_WAbility.MAC) + 1) > 0)
  1544. nArmor = LOBYTE(m_WAbility.MAC) + (rand() % (HIBYTE(m_WAbility.MAC) - LOBYTE(m_WAbility.MAC) + 1));
  1545. else
  1546. nArmor = LOBYTE(m_WAbility.MAC);
  1547. nDamage = _MAX(0, nDamage - nArmor);
  1548. if (nDamage > 0)
  1549. {
  1550. if (m_fAbilMagBubbleDefence) // 林贱狼阜
  1551. {
  1552. nDamage = ROUND(nDamage / 100 * (m_btMagBubbleDefenceLevel + 2) * 8);
  1553. DamageBubbleDefence();
  1554. }
  1555. }   
  1556. return nDamage;
  1557. }
  1558. void CCharObject::StruckDamage(int nDamage)
  1559. {
  1560. if (nDamage > 0)
  1561. {
  1562. BOOL fReCalc = FALSE;
  1563. int wDam = (rand() % 10) + 5;
  1564. if (m_wStatusArr[POISON_DAMAGEARMOR] > 0)
  1565. {
  1566. wDam = ROUND(wDam * 1.2);
  1567. nDamage = ROUND(nDamage * 1.2);
  1568. }
  1569. if (m_pUserInfo)
  1570. {
  1571. _LPTUSERITEMRCD lptDress = m_pUserInfo->GetDress();
  1572. if (lptDress)
  1573. {
  1574. int nDura = lptDress->nDura;
  1575. int nOldDura = ROUND(nDura / 1000);
  1576. nDura -= wDam;
  1577. if (nDura <= 0) // 粹酒 绝绢咙
  1578. {
  1579. lptDress->nDura = nDura = 0;
  1580. //               hum.SendDelItem (UseItems[U_DRESS]); //努扼捞攫飘俊 绝绢柳芭 焊晨
  1581. m_pUserInfo->SetEmptyDress();
  1582. AddProcess(this, RM_DURACHANGE, U_DRESS, nDura, lptDress->nDuraMax, 0); 
  1583. AddProcess(this, RM_FEATURECHANGED, 0, GetFeatureToLong(), 0, 0);
  1584. fReCalc = TRUE;
  1585. }
  1586. else
  1587. lptDress->nDura = nDura;
  1588. if (nOldDura != ROUND(nDura / 1000))
  1589. AddProcess(this, RM_DURACHANGE, U_DRESS, lptDress->nDura, lptDress->nDuraMax, 0); 
  1590. }
  1591. _LPTUSERITEMRCD lptUseItem;
  1592. for (int i = 0; i < 8; i++)
  1593. {
  1594. lptUseItem = m_pUserInfo->GetUseItem(i);
  1595. if (lptUseItem && (rand() % 8) == 0)
  1596. {
  1597. int nDura = lptUseItem->nDura;
  1598. int nOldDura = ROUND(nDura / 1000);
  1599. nDura -= wDam;
  1600. if (nDura <= 0) // 粹酒 绝绢咙
  1601. {
  1602. lptUseItem->nDura = nDura = 0;
  1603. //               hum.SendDelItem (UseItems[U_DRESS]); //努扼捞攫飘俊 绝绢柳芭 焊晨
  1604. m_pUserInfo->SetEmptyUseItem(i);
  1605. AddProcess(this, RM_DURACHANGE, i, nDura, lptUseItem->nDuraMax, 0); 
  1606. AddProcess(this, RM_FEATURECHANGED, 0, GetFeatureToLong(), 0, 0);
  1607. fReCalc = TRUE;
  1608. }
  1609. else
  1610. lptUseItem->nDura = nDura;
  1611. if (nOldDura != ROUND(nDura / 1000))
  1612. AddProcess(this, RM_DURACHANGE, i, lptUseItem->nDura, lptUseItem->nDuraMax, 0); 
  1613. }
  1614. }
  1615. }
  1616. if (fReCalc && m_pUserInfo)
  1617. ((CPlayerObject*)this)->RecalcAbilitys();
  1618. DamageHealth(nDamage);
  1619. }
  1620. }
  1621. int CCharObject::GetHitStruckDamage(int nDamage)
  1622. {
  1623. int nArmor;
  1624. int nRnd = ((HIBYTE(m_WAbility.AC) - LOBYTE(m_WAbility.AC)) + 1);
  1625. if (nRnd > 0)
  1626. nArmor = LOBYTE(m_WAbility.AC) + (rand() % nRnd);
  1627. else
  1628. nArmor = LOBYTE(m_WAbility.AC);
  1629. nDamage = _MAX(0, nDamage - nArmor);
  1630. if (nDamage > 0)
  1631. {
  1632. if (m_fAbilMagBubbleDefence) // 林贱狼阜
  1633. {
  1634. nDamage = ROUND(nDamage / 100 * (m_btMagBubbleDefenceLevel + 2) * 8);
  1635. DamageBubbleDefence();
  1636. }
  1637. }   
  1638. return nDamage;
  1639. }
  1640. int CCharObject::GetAttackPower(int nDamage, int nVal)
  1641. {
  1642. int nPower = 0;
  1643. if (nVal < 0) nVal = 0;
  1644. // if (Lucky > 0)
  1645. // {
  1646. // }
  1647. // else
  1648. // {
  1649. nPower = nDamage + (rand() % (nVal + 1));
  1650. // }
  1651. return nPower;
  1652. /*var
  1653.    v1, v2: integer;
  1654. begin
  1655.    if val < 0 then val := 0;
  1656.    if Luck > 0 then begin
  1657.       if Random(10 - _MIN(9,Luck)) = 0 then Result := damage + val //青款牢版快
  1658.       else Result := damage + Random(val + 1);
  1659.    end else begin
  1660.       Result := damage + Random(val + 1);
  1661.       if Luck < 0 then begin
  1662.          if Random(10 - _MAX(0,-Luck)) = 0 then Result := damage;  //阂款牢版快
  1663.       end;
  1664.    end; */
  1665. }
  1666. void CCharObject::DoDamageWeapon(int nDamage)
  1667. {
  1668. if (m_pUserInfo)
  1669. {
  1670. _LPTUSERITEMRCD lptWeapon = m_pUserInfo->GetWeapon();
  1671. if (lptWeapon)
  1672. {
  1673. int nDura = lptWeapon->nDura;
  1674. int nOldDura = ROUND(nDura / 1000);
  1675. nDura -= nDamage;
  1676. if (nDura <= 0) // 粹酒 绝绢咙
  1677. {
  1678. lptWeapon->nDura = nDura = 0;
  1679. //               hum.SendDelItem (UseItems[U_DRESS]); //努扼捞攫飘俊 绝绢柳芭 焊晨
  1680. ((CPlayerObject*)this)->RecalcAbilitys();
  1681. m_pUserInfo->SetEmptyWeapon();
  1682. AddProcess(this, RM_DURACHANGE, U_WEAPON, nDura, lptWeapon->nDuraMax, 0); 
  1683. }
  1684. else
  1685. lptWeapon->nDura = nDura;
  1686. if (nOldDura != ROUND(nDura / 1000))
  1687. AddProcess(this, RM_DURACHANGE, U_WEAPON, lptWeapon->nDura, lptWeapon->nDuraMax, 0); 
  1688. }
  1689. }
  1690. }
  1691. BOOL CCharObject::_Attack(WORD wHitMode, CCharObject* pObject)
  1692. {
  1693. int nPower = GetAttackPower(LOBYTE(m_WAbility.DC), (HIBYTE(m_WAbility.DC) - LOBYTE(m_WAbility.DC)));
  1694. int nSecPwr = 0;
  1695. int nWeaponDamage;
  1696. if (pObject)
  1697. {
  1698. if (wHitMode == CM_POWERHIT && m_pUserInfo->m_fPowerHitSkill)
  1699. {
  1700. m_pUserInfo->m_fPowerHitSkill = FALSE;
  1701. nPower += m_btHitPlus;
  1702. }
  1703. if (wHitMode == CM_FIREHIT && m_pUserInfo->m_fFireHitSkill)
  1704. {
  1705. m_pUserInfo->m_fFireHitSkill = FALSE;
  1706. nPower += ROUND(nPower / 100 * (m_nHitDouble * 10));
  1707. }
  1708. }
  1709. else
  1710. {
  1711. if (wHitMode == CM_POWERHIT && m_pUserInfo->m_fPowerHitSkill)
  1712. {
  1713. m_pUserInfo->m_fPowerHitSkill = FALSE;
  1714. nPower += m_btHitPlus;
  1715. }
  1716. }
  1717. if (wHitMode == CM_LONGHIT)
  1718. {
  1719. nSecPwr = 0;
  1720. if (m_pUserInfo->m_lpTMagicErgumSkill)
  1721. nSecPwr = ROUND(nPower / (3/*MaxTrainLevel*/ + 2) * (m_pUserInfo->m_lpTMagicErgumSkill->btLevel + 2));
  1722. else
  1723. nSecPwr = nPower;
  1724. if (nSecPwr > 0)
  1725. SwordLongAttack(nSecPwr);
  1726. }
  1727. if (wHitMode == CM_WIDEHIT)
  1728. {
  1729. nSecPwr = 0;
  1730. if (m_pUserInfo->m_lpTMagicBanwolSkill)
  1731. nSecPwr = ROUND(nPower / (3/*MaxTrainLevel*/ + 10) * (m_pUserInfo->m_lpTMagicBanwolSkill->btLevel + 2));
  1732. else
  1733. nSecPwr = nPower;
  1734. if (nSecPwr > 0)
  1735. SwordWideAttack(nSecPwr);
  1736. }
  1737. if (pObject)
  1738. {
  1739. if (IsProperTarget(pObject))
  1740. {
  1741. if (pObject->m_btHitPoint > 0)
  1742. {
  1743. if (m_btHitPoint < rand() % pObject->m_btSpeedPoint)
  1744. nPower = 0;
  1745. }
  1746. }
  1747. else
  1748. nPower = 0;
  1749. }
  1750. if (nPower > 0)
  1751. {
  1752. nPower = pObject->GetHitStruckDamage(nPower);
  1753. nWeaponDamage = (rand() % 5) + 2 - m_AddAbility.WeaponStrong;
  1754. /* if (m_wObjectType & _OBJECT_HUMAN)
  1755. {
  1756. case CM_FIREHIT:
  1757. {
  1758. if (m_pUserInfo->m_lpTMagicFireSwordSkill)
  1759. nSecPwr = _ROUND(nPwr / (3 + 2) * (m_pUserInfo->m_lpTMagicFireSwordSkill->btLevel + 2));
  1760. else
  1761. nSecPwr = nPower;
  1762. break;
  1763. }   
  1764. }
  1765. */
  1766. if (nWeaponDamage > 0)
  1767. {
  1768. if (m_pUserInfo->GetWeapon()) 
  1769. DoDamageWeapon(nWeaponDamage);
  1770. }
  1771. if (nPower > 0)
  1772. {
  1773. pObject->StruckDamage(nPower);
  1774. // Debug Code
  1775. #ifdef _DEBUG
  1776. char szMsg[64];
  1777. if (m_wObjectType & _OBJECT_HUMAN)
  1778. {
  1779. sprintf(szMsg, "%s 嘎澜 - PW:%d HP:%d, 公扁郴备粹澜:%d", pObject->m_szName, nPower, pObject->m_WAbility.HP, nWeaponDamage);
  1780. SysMsg(szMsg, 0);
  1781. }
  1782. else if (pObject->m_wObjectType & _OBJECT_HUMAN)
  1783. {
  1784. sprintf(szMsg, "%s 嘎澜 - PW:%d HP:%d", pObject->m_szName, nPower, pObject->m_WAbility.HP);
  1785. pObject->SysMsg(szMsg, 0);
  1786. }
  1787. // Debug Code
  1788. #endif
  1789. AddDelayProcess(pObject, RM_STRUCK, nPower, pObject->m_WAbility.HP, pObject->m_WAbility.MaxHP, (LONG)this, NULL, 550);
  1790. if (!(pObject->m_wObjectType & _OBJECT_HUMAN))
  1791. pObject->AddProcess(pObject, RM_STRUCK, nPower, pObject->m_WAbility.HP, pObject->m_WAbility.MaxHP, (LONG)this, NULL);
  1792. return TRUE;
  1793. }
  1794. }
  1795. return FALSE;
  1796. }    
  1797. BOOL CCharObject::HitXY(WORD wIdent, int nX, int nY, int nDir, int nHitStyle)
  1798. {
  1799. if ((GetTickCount() - m_dwLatestHitTime) < 600)
  1800. m_nHitTimeOverCount++;
  1801. else
  1802. m_nHitTimeOverCount = 0;
  1803. if (m_nHitTimeOverCount < 2)
  1804. {
  1805. if (m_nCurrX == nX && m_nCurrY == nY)
  1806. {
  1807. if (wIdent == CM_WIDEHIT && m_pUserInfo->m_lpTMagicBanwolSkill)
  1808. {
  1809. if (m_WAbility.MP > 0)
  1810. {
  1811. int nLevel = m_pUserInfo->GetMagicRcdByID(_SKILL_BANWOL)->btLevel;
  1812. int nSpellPoint = GetMagicInfo(_SKILL_BANWOL)->GetSpellPoint(nLevel);
  1813. DamageSpell(nSpellPoint);
  1814. HealthSpellChanged();
  1815. }
  1816. else
  1817. wIdent = CM_HIT;
  1818. }
  1819. m_nDirection = nDir;
  1820. m_dwLatestHitTime = GetTickCount();
  1821. CCharObject* pObject = GetFrontObject();
  1822. if (pObject)
  1823. {
  1824. if (_Attack(wIdent, pObject))
  1825. {
  1826. SelectTarget(pObject);
  1827. m_dwHealthTick -= 100;
  1828. m_dwSpellTick -= 100;
  1829. m_dwSpellTick = _MAX(0, m_dwSpellTick);
  1830. m_btPerHealth -= 2;
  1831. m_btPerSpell -= 2;
  1832. }
  1833. }
  1834. if (m_wObjectType & _OBJECT_HUMAN)
  1835. {
  1836. switch (wIdent)
  1837. {
  1838. case CM_HIT:
  1839. AddRefMsg(RM_HIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
  1840. break;
  1841. case CM_WIDEHIT:
  1842. AddRefMsg(RM_WIDEHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
  1843. break;
  1844. case CM_LONGHIT:
  1845. AddRefMsg(RM_LONGHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
  1846. break;
  1847. case CM_FIREHIT:
  1848. AddRefMsg(RM_FIREHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
  1849. break;
  1850. case CM_POWERHIT:
  1851. AddRefMsg(RM_POWERHIT, nDir, m_nCurrX, m_nCurrY, nHitStyle, NULL);
  1852. break;
  1853. }
  1854. }
  1855. if (m_pUserInfo->m_lpTMagicPowerHitSkill) // 抗档 八过
  1856. {
  1857. m_pUserInfo->m_btAttackSkillCount--;
  1858. if (m_pUserInfo->m_btAttackSkillCount == m_pUserInfo->m_btAttackSkillPointCount)
  1859. {
  1860. m_pUserInfo->m_fPowerHitSkill = TRUE;
  1861. SendSocket(NULL, "+PWR");
  1862. }
  1863. if (m_pUserInfo->m_btAttackSkillCount <= 0)
  1864. {
  1865. m_pUserInfo->m_btAttackSkillCount = 7 - m_pUserInfo->m_lpTMagicPowerHitSkill->btLevel;
  1866. m_pUserInfo->m_btAttackSkillPointCount = rand() % m_pUserInfo->m_btAttackSkillCount;
  1867. }
  1868. }
  1869. return TRUE;
  1870. }
  1871. }
  1872. return FALSE;
  1873. }
  1874. void CCharObject::DoPushed(int nDirection)
  1875. {
  1876. int nFrontX, nFrontY;
  1877. m_nDirection = nDirection;
  1878. GetFrontPosition(nFrontX, nFrontY);
  1879. if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
  1880. {
  1881. AddRefMsg(RM_PUSH, GetBack(nDirection), m_nCurrX, m_nCurrY, 0, NULL);
  1882. m_nCurrX = nFrontX;
  1883. m_nCurrY = nFrontY;
  1884. }
  1885. }
  1886. void CCharObject::GoldChanged()
  1887. {
  1888. if (m_wObjectType & _OBJECT_HUMAN)
  1889. UpdateProcess(this, RM_GOLDCHANGED, 0, 0, 0, 0, NULL);
  1890. }
  1891. void CCharObject::HealthSpellChanged()
  1892. {
  1893. if (m_wObjectType & _OBJECT_HUMAN)
  1894. UpdateProcess(this, RM_HEALTHSPELLCHANGED, 0, 0, 0, 0, NULL);
  1895. if (m_fOpenHealth)
  1896. AddRefMsg(RM_HEALTHSPELLCHANGED, 0, 0, 0, 0, NULL);
  1897. }
  1898. CCharObject* CCharObject::AddCreatureSysop(int nX, int nY, CMonRaceInfo* pMonRaceInfo, BOOL fSearch)
  1899. {
  1900. CMonsterObject* pMonObject = AddCreature(m_pMap, nX, nY, pMonRaceInfo->nIndex, fSearch);
  1901. if (pMonObject)
  1902. {
  1903. if (g_pMonGenInfo)
  1904. g_pMonGenInfo[g_nNumOfMonGenInfo].xMonsterObjList.AddNewNode(pMonObject);
  1905. }
  1906. return (CCharObject*)pMonObject;
  1907. }
  1908. void CCharObject::DoMotaebo()
  1909. {
  1910. int nFrontX, nFrontY;
  1911. CCharObject* pCharObject = GetFrontObject();
  1912. if (pCharObject)
  1913. {
  1914. for (int i = 0; i < 5; i++)
  1915. {
  1916. pCharObject->DoPushed(m_nDirection);
  1917. GetFrontPosition(nFrontX, nFrontY);
  1918. if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
  1919. {
  1920. AddRefMsg(RM_RUSH, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
  1921. m_nCurrX = nFrontX;
  1922. m_nCurrY = nFrontY;
  1923. if (!(pCharObject = GetFrontObject()))
  1924. break;
  1925. }
  1926. else 
  1927. break;
  1928. }
  1929. }
  1930. else
  1931. {
  1932. for (int i = 0; i < 5; i++)
  1933. {
  1934. GetFrontPosition(nFrontX, nFrontY);
  1935. if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
  1936. {
  1937. AddRefMsg(RM_RUSH, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);
  1938. m_nCurrX = nFrontX;
  1939. m_nCurrY = nFrontY;
  1940. }
  1941. else
  1942. break;
  1943. }
  1944. }
  1945. }
  1946. /* **************************************************************************************
  1947. 沤扁颇楷
  1948.    ************************************************************************************** */
  1949. BOOL CCharObject::DoShowHP(CCharObject* pObject, CMagicInfo* pMagicInfo, int nLevel)
  1950. {
  1951. if (pObject)
  1952. {
  1953. if (!pObject->m_fOpenHealth)
  1954. {
  1955. if ((rand() % 6) <= (3 + m_Ability.Level))
  1956. {
  1957. pObject->m_dwOpenHealthStart = GetTickCount();
  1958. pObject->m_dwOpenHealthTime = pMagicInfo->GetPower13(30 + GetRPow(m_WAbility.SC) * 2, nLevel) * 1000;
  1959. pObject->AddDelayProcess(pObject, RM_DOOPENHEALTH, 0, 0, 0, 0, NULL, 3000);
  1960. return TRUE;
  1961. }
  1962. }
  1963. }
  1964. return FALSE;
  1965. }
  1966. void CCharObject::MakeOpenHealth()
  1967. {
  1968. m_fOpenHealth = TRUE;
  1969.    
  1970. m_nCharStatusEx |= STATE_OPENHEATH;
  1971. m_nCharStatus = GetCharStatus();
  1972.    
  1973. AddRefMsg(RM_OPENHEALTH, 0, m_WAbility.HP/*lparam1*/, m_WAbility.MaxHP/*lparam2*/, 0, NULL);
  1974. }
  1975. void CCharObject::BreakOpenHealth()
  1976. {
  1977. m_fOpenHealth = FALSE;
  1978.    
  1979. m_nCharStatusEx ^= STATE_OPENHEATH;
  1980. m_nCharStatus = GetCharStatus();
  1981.    
  1982. AddRefMsg(RM_CLOSEHEALTH, 0, 0, 0, 0, NULL);
  1983. }
  1984. /* **************************************************************************************
  1985. 公怕焊
  1986.    ************************************************************************************** */
  1987. int CCharObject::CharPushed(int nDir, int nPushCount)
  1988. {
  1989. int nFrontX, nFrontY;
  1990. int nResult = 0;
  1991. for (int i = 0; i < nPushCount; i++)
  1992. {
  1993. GetFrontPosition(nFrontX, nFrontY);
  1994. if (m_pMap->CanMove(nFrontX, nFrontY, FALSE))
  1995. {
  1996. if (m_pMap->MoveToMovingObject(m_nCurrX, m_nCurrY, nFrontX, nFrontY, this))
  1997. {
  1998. m_nCurrX = nFrontX;
  1999. m_nCurrY = nFrontY;
  2000. AddRefMsg(RM_PUSH, GetBack(nDir), m_nCurrX, m_nCurrY, 0, NULL);
  2001. nResult++;
  2002. }
  2003. }
  2004. }
  2005. m_nDirection = GetBack(nDir);
  2006. return nResult;
  2007. /*function  TCreature.CharPushed (ndir, pushcount: integer): integer;  //绢恫 塞俊 狼秦辑 剐妨唱促.
  2008. var
  2009.    i, nx, ny, olddir, oldx, oldy: integer;
  2010. begin
  2011.    Result := 0;
  2012.    olddir := Dir;
  2013.    oldx := CX;
  2014.    oldy := CY;
  2015.    Dir := ndir;
  2016.    for i:=0 to pushcount-1 do begin
  2017.       GetFrontPosition (self, nx, ny);
  2018.       if PEnvir.CanWalk (nx, ny, FALSE{扳魔倾侩救窃}) then begin
  2019.          if PEnvir.MoveToMovingObject (CX, CY, self, nx, ny, FALSE) > 0 then begin
  2020.             CX := nx;
  2021.             CY := ny;
  2022.             SendRefMsg (RM_PUSH, GetBack(ndir), CX, CY, 0, '');
  2023.             Inc (Result);
  2024.             if RaceServer >= RC_ANIMAL then
  2025.                WalkTime := WalkTime + 800; //剐府搁辑 词霸 锭赴促.
  2026.          end else
  2027.             break;
  2028.       end else
  2029.          break;
  2030.    end;
  2031.    Dir := GetBack(ndir); //olddir;
  2032. end;
  2033. */
  2034. }
  2035. /* **************************************************************************************
  2036. 拳堪浅
  2037.    ************************************************************************************** */
  2038. int CCharObject::MagPushArround(int nPushLevel)
  2039. {
  2040. int nLevelGap, nPush,nDir;
  2041. int nResult = 0;
  2042. if (m_xVisibleObjectList.GetCount())
  2043. {
  2044. PLISTNODE pListNode = m_xVisibleObjectList.GetHead();
  2045. CVisibleObject* pVisibleObject;
  2046. while (pListNode)
  2047. {
  2048. if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
  2049. {
  2050. if (abs(m_nCurrX - pVisibleObject->pObject->m_nCurrX) <= 1 && abs(m_nCurrY - pVisibleObject->pObject->m_nCurrY) <= 1)
  2051. {
  2052. if (!pVisibleObject->pObject->m_fIsDead && pVisibleObject->pObject != this)
  2053. {
  2054. if (m_Ability.Level > pVisibleObject->pObject->m_Ability.Level)
  2055. {
  2056. nLevelGap = m_Ability.Level - pVisibleObject->pObject->m_Ability.Level;
  2057. if ((rand() % 20) < 6 + nPushLevel * 3 + nLevelGap)
  2058. {
  2059. if (IsProperTarget(pVisibleObject->pObject))
  2060. {
  2061. nPush = 1 + _MAX(0, nPushLevel - 1) + rand() % 2;
  2062. nDir = GetNextDirection (pVisibleObject->pObject->m_nCurrX, pVisibleObject->pObject->m_nCurrY);
  2063. pVisibleObject->pObject->CharPushed(nDir, nPush);
  2064. nResult++;
  2065. }
  2066. }
  2067. }
  2068. }
  2069. }
  2070. } // if (pVisibleObject = m_xVisibleObjectList.GetData(pListNode))
  2071. pListNode = m_xVisibleObjectList.GetNext(pListNode);
  2072. } // while (pListNode)
  2073. }
  2074. return nResult;
  2075. /*function  TMagicManager.MagPushArround (user: TCreature; pushlevel: integer): integer;
  2076. var
  2077.    i, ndir, levelgap, push: integer;
  2078.    cret: TCreature;
  2079. begin
  2080.    Result := 0;
  2081.    for i:=0 to user.VisibleActors.Count-1 do begin
  2082.       cret := TCreature (PTVisibleActor(user.VisibleActors[i]).cret);
  2083.       if (abs(user.CX-cret.CX) <= 1) and (abs(user.CY-cret.CY) <= 1) then begin
  2084.          if (not cret.Death) and (cret <> user) then begin
  2085.             if (user.Abil.Level > cret.Abil.Level) and (not cret.StickMode) then begin
  2086.                levelgap := user.Abil.Level - cret.Abil.Level;
  2087.                if (Random(20) < 6+pushlevel*3+levelgap) then begin  //荐访沥档俊 蝶扼辑
  2088.                   if user.IsProperTarget(cret) then begin
  2089.                      push := 1 + _MAX(0,pushlevel-1) + Random(2);
  2090.                      ndir := GetNextDirection (user.CX, user.CY, cret.CX, cret.CY);
  2091.                      cret.CharPushed (ndir, push);
  2092.                      Inc (Result);
  2093.                   end;
  2094.                end;
  2095.             end;
  2096.          end;
  2097.       end;
  2098.    end;
  2099. end;
  2100. */
  2101. }
  2102. /* **************************************************************************************
  2103. 堪荤厘, 汾牢厘
  2104.    ************************************************************************************** */
  2105. int CCharObject::MagPassThroughMagic(int nStartX, int nStartY, int nTargetX, int nTargetY, int nDir, int nPwr, BOOL fUndeadAttack)
  2106. {
  2107. int nResult = 0;
  2108. CCharObject* pObject;
  2109. for (int i = 0; i < 12; i++)
  2110. {
  2111. pObject = m_pMap->GetObject(nStartX, nStartY);
  2112. if (pObject)
  2113. {
  2114. if (IsProperTarget(pObject))
  2115. {
  2116. if (pObject->m_btAntiMagic <= rand() % 10)
  2117. {
  2118. if (fUndeadAttack)
  2119. nPwr = ROUND(nPwr * 1.5);
  2120. pObject->AddDelayProcess(this, RM_MAGSTRUCK, 0, nPwr, 0, 0, NULL, 600);
  2121. nResult++;
  2122. }
  2123. }
  2124. }
  2125. if (!((abs(nStartX - nTargetX) <= 0) && (abs(nStartY - nTargetY) <= 0)))
  2126. {
  2127. nDir = GetNextDirection(nStartX, nStartY, nTargetX, nTargetY);
  2128. if (!(GetNextPosition(nStartX, nStartY, nDir, 1, nStartX, nStartY)))
  2129. break;
  2130. }
  2131. else
  2132. break;
  2133. }
  2134. return nResult;
  2135. /*
  2136. function  TCreature.MagPassThroughMagic (sx, sy, tx, ty, ndir, magpwr: integer; undeadattack: Boolean): integer;
  2137. var
  2138.    i, tcount, acpwr: integer;
  2139.    cret: TCreature;
  2140. begin
  2141.    tcount := 0;
  2142.    for i:=0 to 12 do begin
  2143.       cret := TCreature (PEnvir.GetCreature (sx, sy, TRUE));
  2144.       if cret <> nil then begin
  2145.          //if (RaceServer = RC_USERHUMAN) and (cret.RaceServer = RC_USERHUMAN) and ((cret.InSafeZone) or (InSafeZone)) then
  2146.          //   continue;  //救傈瘤措
  2147.          if IsProperTarget (cret) then begin
  2148.             if cret.AntiMagic <= Random(10) then begin  //付过 雀乔啊 乐澜
  2149.                if undeadattack then  //攫单靛 阁胶磐俊霸 傍拜仿 碍拳牢 版快
  2150.                   acpwr := Round (magpwr * 1.5)
  2151.                else
  2152.                   acpwr := magpwr;
  2153.                cret.SendDelayMsg (self, RM_MAGSTRUCK, 0, acpwr, 0, 0, '', 600);
  2154.                Inc (tcount);
  2155.             end;
  2156.          end;
  2157.       end;
  2158.       if not ((abs(sx-tx) <= 0) and (abs(sy-ty) <= 0)) then begin
  2159.          ndir := GetNextDirection (sx, sy, tx, ty);
  2160.          if not GetNextPosition (PEnvir, sx, sy, ndir, 1, sx, sy) then
  2161.             break;
  2162.       end else
  2163.          break;
  2164.    end;
  2165.    Result := tcount;
  2166. end; */
  2167. }
  2168. /* **************************************************************************************
  2169. 林贱狼阜
  2170.    ************************************************************************************** */
  2171. BOOL CCharObject::MagBubbleDefenceUp(int nLevel, int nSec)
  2172. {
  2173. if (m_wStatusArr[STATE_BUBBLEDEFENCEUP] == 0)
  2174. {
  2175. UINT nOldStatus = m_nCharStatus;
  2176. m_wStatusArr[STATE_BUBBLEDEFENCEUP] = (WORD)nSec; 
  2177. m_dwStatusTime[STATE_BUBBLEDEFENCEUP] = GetTickCount();
  2178. m_nCharStatus = GetCharStatus();
  2179. if (nOldStatus != m_nCharStatus)
  2180. AddRefMsg(RM_CHARSTATUSCHANGED, m_sHitSpeed/*wparam*/, m_nCharStatus, 0, 0, NULL);
  2181. m_fAbilMagBubbleDefence = TRUE;
  2182. m_btMagBubbleDefenceLevel = nLevel;
  2183. return TRUE;
  2184. }
  2185. return FALSE;
  2186. }
  2187. void CCharObject::DamageBubbleDefence()
  2188. {
  2189. if (m_wStatusArr[STATE_BUBBLEDEFENCEUP] > 0)
  2190. {
  2191. if (m_wStatusArr[STATE_BUBBLEDEFENCEUP] > 3)
  2192. m_wStatusArr[STATE_BUBBLEDEFENCEUP] -= 3;
  2193. else
  2194. m_wStatusArr[STATE_BUBBLEDEFENCEUP] = 1;
  2195. }
  2196. }
  2197. /* **************************************************************************************
  2198. 瘤堪贱
  2199.    ************************************************************************************** */
  2200. int CCharObject::MagMakeFireCross(int nDamage, int nHTime, int nX, int nY)
  2201. {
  2202.    if (!(m_pMap->GetEvent(nX, nY - 1)))
  2203.    {
  2204.    CEvent *pEvent = (CEvent*)new CFireBurnEvent(nX, nY - 1, nHTime * 100, this, nDamage);
  2205.    g_xEventList.AddNewNode(pEvent);
  2206.    }
  2207.    
  2208.    if (!(m_pMap->GetEvent(nX - 1, nY)))
  2209.    {
  2210.    CEvent *pEvent = (CEvent*)new CFireBurnEvent(nX - 1, nY, nHTime * 100, this, nDamage);
  2211.    g_xEventList.AddNewNode(pEvent);
  2212.    }
  2213.    
  2214.    if (!(m_pMap->GetEvent(nX, nY)))
  2215.    {
  2216.    CEvent *pEvent = (CEvent*)new CFireBurnEvent(nX, nY, nHTime * 100, this, nDamage);
  2217.    g_xEventList.AddNewNode(pEvent);
  2218.    }
  2219.    if (!(m_pMap->GetEvent(nX + 1, nY)))
  2220.    {
  2221.    CEvent *pEvent = (CEvent*)new CFireBurnEvent(nX + 1, nY, nHTime * 100, this, nDamage);
  2222.    g_xEventList.AddNewNode(pEvent);
  2223.    }
  2224.    if (!(m_pMap->GetEvent(nX, nY + 1)))
  2225.    {
  2226.    CEvent *pEvent = (CEvent*)new CFireBurnEvent(nX, nY + 1, nHTime * 100, this, nDamage);
  2227.    g_xEventList.AddNewNode(pEvent);
  2228.    }
  2229.    return 1;
  2230. }
  2231. /* **************************************************************************************
  2232. 搬拌
  2233.    ************************************************************************************** */
  2234. int CCharObject::MagMakeHolyCurtain(int nHTime, int nX, int nY)
  2235. {
  2236. int nResult = 0;
  2237. CWHList<CCharObject*> ObjectList;
  2238. CHolySeizeInfo* pHolySeizeInfo = NULL;
  2239. if (m_pMap->CanMove(nX, nY, TRUE))
  2240. {
  2241. m_pMap->GetMapObject(nX, nY, 1, &ObjectList);
  2242. if (ObjectList.GetCount())
  2243. {
  2244. PLISTNODE pListNode = ObjectList.GetHead();
  2245. CMonsterObject* pTargetObject;
  2246. while (pListNode)
  2247. {
  2248. if (pTargetObject = (CMonsterObject*)ObjectList.GetData(pListNode))
  2249. {
  2250. if ((pTargetObject->m_wObjectType & _OBJECT_ANIMAL) && (pTargetObject->m_Ability.Level < m_Ability.Level - 1 + rand() % 4) &&
  2251.  (pTargetObject->m_Ability.Level < 50) && (pTargetObject->m_pMasterObject == NULL))
  2252. {
  2253. pTargetObject->MakeHolySeize(nHTime * 1000);
  2254. if (!pHolySeizeInfo)
  2255. {
  2256. pHolySeizeInfo = new CHolySeizeInfo;
  2257. for (int i = 0; i < 7; i++)
  2258. pHolySeizeInfo->Event[0] = NULL;
  2259. pHolySeizeInfo->dwOpenTime = GetTickCount();
  2260. pHolySeizeInfo->dwSeizeTime = nHTime * 1000;
  2261. }
  2262. pHolySeizeInfo->SeizeList.AddNewNode(pTargetObject);
  2263. nResult++;
  2264. }
  2265. }
  2266. pListNode = ObjectList.RemoveNode(pListNode);
  2267. }
  2268. }
  2269. if (nResult > 0 && pHolySeizeInfo)
  2270. {
  2271.    CEvent *pEvent = (CEvent*)new CHolyCurtainEvent(nX - 1, nY - 2, nHTime * 1000, this);
  2272.    g_xEventList.AddNewNode(pEvent);
  2273.    pHolySeizeInfo->Event[0] = pEvent;
  2274.    pEvent = (CEvent*)new CHolyCurtainEvent(nX + 1, nY - 2, nHTime * 1000, this);
  2275.    g_xEventList.AddNewNode(pEvent);
  2276.    pHolySeizeInfo->Event[1] = pEvent;
  2277.    pEvent = (CEvent*)new CHolyCurtainEvent(nX - 2, nY - 1, nHTime * 1000, this);
  2278.    g_xEventList.AddNewNode(pEvent);
  2279.    pHolySeizeInfo->Event[2] = pEvent;
  2280.    pEvent = (CEvent*)new CHolyCurtainEvent(nX + 2, nY - 1, nHTime * 1000, this);
  2281.    g_xEventList.AddNewNode(pEvent);
  2282.    pHolySeizeInfo->Event[3] = pEvent;
  2283.    pEvent = (CEvent*)new CHolyCurtainEvent(nX - 2, nY + 1, nHTime * 1000, this);
  2284.    g_xEventList.AddNewNode(pEvent);
  2285.    pHolySeizeInfo->Event[4] = pEvent;
  2286.    pEvent = (CEvent*)new CHolyCurtainEvent(nX + 2, nY + 1, nHTime * 1000, this);
  2287.    g_xEventList.AddNewNode(pEvent);
  2288.    pHolySeizeInfo->Event[5] = pEvent;
  2289.    pEvent = (CEvent*)new CHolyCurtainEvent(nX - 1, nY + 2, nHTime * 1000, this);
  2290.    g_xEventList.AddNewNode(pEvent);
  2291.    pHolySeizeInfo->Event[6] = pEvent;
  2292.    pEvent = (CEvent*)new CHolyCurtainEvent(nX + 1, nY + 2, nHTime * 1000, this);
  2293.    g_xEventList.AddNewNode(pEvent);
  2294.    pHolySeizeInfo->Event[7] = pEvent;
  2295.    g_xHolySeizeList.AddNewNode(pHolySeizeInfo);
  2296. }
  2297. }
  2298. return nResult;
  2299. }
  2300. /* **************************************************************************************
  2301. 绢八贱
  2302.    ************************************************************************************** */
  2303. BOOL CCharObject::DirectAttack(CCharObject* pTargetObject, int nDamage)
  2304. {
  2305. if (pTargetObject->m_wObjectType & _OBJECT_HUMAN)
  2306. return FALSE;
  2307. if (IsProperTarget(pTargetObject))
  2308. {
  2309. if (rand() % pTargetObject->m_btSpeedPoint < m_btHitPoint)
  2310. {
  2311. pTargetObject->StruckDamage(nDamage);
  2312. pTargetObject->AddDelayProcess(pTargetObject, RM_STRUCK, nDamage, pTargetObject->m_WAbility.HP, pTargetObject->m_WAbility.MaxHP, (LONG)this, NULL, 550);
  2313. return TRUE;
  2314. }
  2315. }
  2316. return FALSE;
  2317. }
  2318. BOOL CCharObject::SwordLongAttack(int nDamage)
  2319. {
  2320. int nX = 0, nY = 0;
  2321. if (GetNextPosition(m_nDirection, 2, nX, nY))
  2322. {
  2323. CCharObject* pTargetObject = m_pMap->GetObject(nX, nY);
  2324. if (pTargetObject && (nDamage > 0))
  2325. {
  2326. if (IsProperTarget(pTargetObject))
  2327. {
  2328. DirectAttack(pTargetObject, nDamage);
  2329. SelectTarget(pTargetObject);
  2330. // Debug Code
  2331. #ifdef _DEBUG
  2332. char szMsg[64];
  2333. sprintf(szMsg, "%s 绢八 嘎澜 - PW:%d HP:%d", pTargetObject->m_szName, nDamage, pTargetObject->m_WAbility.HP);
  2334. SysMsg(szMsg, 0);
  2335. // Debug Code
  2336. #endif
  2337. return TRUE;
  2338. }
  2339. }
  2340. }
  2341. return FALSE;
  2342. }
  2343. /* **************************************************************************************
  2344. 馆岿八过
  2345.    ************************************************************************************** */
  2346. BOOL CCharObject::SwordWideAttack(int nDamage)
  2347. {
  2348. static int WideSearchPos[8] = { 6, 7, 0, 1, 2, 3, 4, 5 };
  2349. static int WideAttack[3] = { 6, 7, 1 };
  2350. int nDir;
  2351. int nX, nY;
  2352. for (int i = 0; i < 3; i++)
  2353. {
  2354. nDir = (m_nDirection + WideAttack[i]) % 8;
  2355. if (GetNextPosition(nDir, 1, nX, nY))
  2356. {
  2357. CCharObject* pTargetObject = m_pMap->GetObject(nX, nY);
  2358. if (pTargetObject && (nDamage > 0))
  2359. {
  2360. if (IsProperTarget(pTargetObject))
  2361. {
  2362. DirectAttack(pTargetObject, nDamage);
  2363. SelectTarget(pTargetObject);
  2364. // Debug Code
  2365. #ifdef _DEBUG
  2366. char szMsg[64];
  2367. sprintf(szMsg, "%s 馆岿 嘎澜 - PW:%d HP:%d", pTargetObject->m_szName, nDamage, pTargetObject->m_WAbility.HP);
  2368. SysMsg(szMsg, 0);
  2369. // Debug Code
  2370. #endif
  2371. return TRUE;
  2372. }
  2373. }
  2374. }
  2375. }
  2376. return FALSE;
  2377. }
  2378. /* **************************************************************************************
  2379. 汾汲拳
  2380.    ************************************************************************************** */
  2381. BOOL CCharObject::MagElecBlizzard(int nPower)
  2382. {
  2383. BOOL fFlag = FALSE;
  2384. CWHList<CCharObject*> ObjectList;
  2385. m_pMap->GetMapObject(m_nCurrX, m_nCurrY, 2, &ObjectList);
  2386. if (ObjectList.GetCount())
  2387. {
  2388. PLISTNODE pListNode = ObjectList.GetHead();
  2389. CCharObject* pTargetObject;
  2390. while (pListNode)
  2391. {
  2392. if (pTargetObject = ObjectList.GetData(pListNode))
  2393. {
  2394. if (pTargetObject->m_wObjectType & _OBJECT_ANIMAL)
  2395. {
  2396. if (((CMonsterObject*)pTargetObject)->m_btLifeAttrib)
  2397. pTargetObject->AddProcess(this, RM_MAGSTRUCK, 0, nPower, 0, 0);
  2398. else
  2399. pTargetObject->AddProcess(this, RM_MAGSTRUCK, 0, nPower / 10, 0, 0);
  2400. fFlag = TRUE;
  2401. }
  2402. }
  2403. pListNode = ObjectList.RemoveNode(pListNode);
  2404. }
  2405. }
  2406. return fFlag;
  2407. }
  2408. /* **************************************************************************************
  2409. 葫汲浅, 气凯颇
  2410.    ************************************************************************************** */
  2411. BOOL CCharObject::MagBigExplosion(int nPower, int nX, int nY, int nWide)
  2412. {
  2413. BOOL fFlag = FALSE;
  2414. CWHList<CCharObject*> ObjectList;
  2415. m_pMap->GetMapObject(nX, nY, nWide, &ObjectList);
  2416. if (ObjectList.GetCount())
  2417. {
  2418. PLISTNODE pListNode = ObjectList.GetHead();
  2419. CCharObject* pTargetObject;
  2420. while (pListNode)
  2421. {
  2422. if (pTargetObject = ObjectList.GetData(pListNode))
  2423. {
  2424. if (IsProperTarget(pTargetObject))
  2425. {
  2426. SelectTarget(pTargetObject);
  2427. pTargetObject->AddProcess(this, RM_MAGSTRUCK, 0, nPower, 0, 0);
  2428. fFlag = TRUE;
  2429. }
  2430. }
  2431. pListNode = ObjectList.RemoveNode(pListNode);
  2432. }
  2433. }
  2434. return fFlag;
  2435. }
  2436. /* **************************************************************************************
  2437. 措雀汗贱
  2438.    ************************************************************************************** */
  2439. BOOL CCharObject::MagBigHealing(int nPower, int nX, int nY)
  2440. {
  2441. BOOL fFlag = FALSE;
  2442. CWHList<CCharObject*> ObjectList;
  2443. m_pMap->GetMapObject(nX, nY, 1, &ObjectList);
  2444. if (ObjectList.GetCount())
  2445. {
  2446. PLISTNODE pListNode = ObjectList.GetHead();
  2447. CCharObject* pTargetObject;
  2448. while (pListNode)
  2449. {
  2450. if (pTargetObject = ObjectList.GetData(pListNode))
  2451. {
  2452. if (IsProperFriend(pTargetObject))
  2453. {
  2454. if (pTargetObject->m_WAbility.HP < pTargetObject->m_WAbility.MaxHP)
  2455. {
  2456. pTargetObject->AddDelayProcess(this, RM_MAGHEALING, 0, nPower, 0, 0, NULL, 800);
  2457. fFlag = TRUE;
  2458. }
  2459. }
  2460. }
  2461. pListNode = ObjectList.RemoveNode(pListNode);
  2462. }
  2463. }
  2464. return fFlag;
  2465. /*function  TMagicManager.MagBigHealing (user: TCreature; pwr, x, y: integer): Boolean;
  2466. var
  2467.    i: integer;
  2468.    rlist: TList;
  2469.    cret: TCreature;
  2470. begin
  2471.    Result := FALSE;
  2472.    rlist := TList.Create;
  2473.    user.GetMapCreatures (user.PEnvir, x, y, 1, rlist);
  2474.    for i:=0 to rlist.Count-1 do begin
  2475.       cret := TCreature (rlist[i]);
  2476.       if user.IsProperFriend (cret) then begin
  2477.          if cret.WAbil.HP < cret.WAbil.MaxHP then begin
  2478.             cret.SendDelayMsg (user, RM_MAGHEALING, 0, pwr, 0, 0, '', 800);
  2479.             Result := TRUE;
  2480.          end;
  2481.          if user.BoAbilSeeHealGauge then begin
  2482.             user.SendMsg (cret, RM_INSTANCEHEALGUAGE, 0, 0, 0, 0, '');
  2483.          end;
  2484.       end;
  2485.    end;
  2486.    rlist.Free;
  2487. end;
  2488. */
  2489. }
  2490. /* **************************************************************************************
  2491. 亲付柳过, 措瘤盔龋
  2492.    ************************************************************************************** */
  2493. BOOL CCharObject::MagDefenceUp(int nState, int nSec)
  2494. {
  2495. BOOL fFlag = FALSE;
  2496. if (m_wStatusArr[nState] > 0)
  2497. {
  2498. if (nSec > m_wStatusArr[nState])
  2499. {
  2500. m_wStatusArr[nState] = nSec;
  2501. fFlag = TRUE;
  2502. }
  2503. }
  2504. else
  2505. {
  2506. m_wStatusArr[nState] = nSec;
  2507. fFlag = TRUE;
  2508. }
  2509. m_dwStatusTime[nState] = GetTickCount();
  2510. TCHAR wszMsg[32], wszMsg2[32];
  2511. char szMsg[32];
  2512. if (nState == STATE_DEFENCEUP)
  2513. LoadString(g_hInst, IDS_DEFENCEUP, wszMsg, sizeof(wszMsg)/sizeof(TCHAR));
  2514. else
  2515. LoadString(g_hInst, IDS_MAGDEFENCEUP, wszMsg, sizeof(wszMsg)/sizeof(TCHAR));
  2516. wsprintf(wszMsg2, wszMsg, nSec);
  2517. WideCharToMultiByte(CP_ACP, 0, wszMsg2, -1, szMsg, sizeof(szMsg), NULL, NULL);
  2518. SysMsg(szMsg, 1);
  2519. if (m_wObjectType & _OBJECT_HUMAN)
  2520. ((CPlayerObject*)this)->RecalcAbilitys();
  2521. AddProcess(this, RM_ABILITY, 0, 0, 0, 0);
  2522. return FALSE;
  2523. }
  2524. BOOL CCharObject::MagMakeDefenceArea(int nX, int nY, int nRange, int nSec, int nState)
  2525. {
  2526. int nStartX = nX - nRange;
  2527. int nEndX = nX + nRange;
  2528. int nStartY = nY - nRange;
  2529. int nEndY = nY + nRange;
  2530. int nCount = 0;
  2531. __try
  2532. {
  2533. for (int x = nStartX; x <= nEndX; x++)
  2534. {
  2535. for (int y = nStartY; y <= nEndY; y++)
  2536. {
  2537. if (CMapCellInfo* pMapCellInfo = m_pMap->GetMapCellInfo(x, y))
  2538. {
  2539. if (pMapCellInfo->m_xpObjectList)
  2540. {
  2541. if (pMapCellInfo->m_xpObjectList->GetCount())
  2542. {
  2543. PLISTNODE pListNode = pMapCellInfo->m_xpObjectList->GetHead();
  2544. while (pListNode)
  2545. {
  2546. _LPTOSOBJECT pOSObject = pMapCellInfo->m_xpObjectList->GetData(pListNode);
  2547. if (pOSObject)
  2548. {
  2549. if (pOSObject->btType == OS_MOVINGOBJECT)
  2550. {
  2551. CCharObject* pCharObject = (CCharObject*)pOSObject->pObject;
  2552. if (!pCharObject->m_fIsGhost)
  2553. {
  2554. if (IsProperFriend(pCharObject))
  2555. {
  2556. pCharObject->MagDefenceUp(nState, nSec);
  2557. nCount++;
  2558. }
  2559. }
  2560. }
  2561. }
  2562. pListNode = pMapCellInfo->m_xpObjectList->GetNext(pListNode);
  2563. } // while (pListNode)
  2564. } // if (pMapCellInfo->m_pObjectList.GetCount())
  2565. }
  2566. } // if (pMapCellInfo)
  2567. }// for (y)
  2568. } // for (x)
  2569. }
  2570. __finally
  2571. {
  2572. }
  2573. return nCount;
  2574. }
  2575. /* **************************************************************************************
  2576. 篮脚贱
  2577.    ************************************************************************************** */
  2578. BOOL CCharObject::MagMakePrivateTransparent(int nHTime)
  2579. {
  2580. if (m_wStatusArr[STATE_TRANSPARENT] > 0)
  2581. return FALSE;
  2582. CWHList<CCharObject*> ObjectList;
  2583. m_pMap->GetMapObject(m_nCurrX, m_nCurrY, 9, &ObjectList);
  2584. if (ObjectList.GetCount())
  2585. {
  2586. PLISTNODE pListNode = ObjectList.GetHead();
  2587. CCharObject* pTargetObject;
  2588. while (pListNode)
  2589. {
  2590. if (pTargetObject = ObjectList.GetData(pListNode))
  2591. {
  2592. if (pTargetObject->m_wObjectType & _OBJECT_ANIMAL)
  2593. {
  2594. if (pTargetObject->m_pTargetObject == this)
  2595. {
  2596. if ((abs(pTargetObject->m_nCurrX - m_nCurrX) > 1) || (abs(pTargetObject->m_nCurrY - m_nCurrY) > 1) || (rand() % 2) == 0)
  2597. pTargetObject->m_pTargetObject = NULL;
  2598. }
  2599. }
  2600. }
  2601. pListNode = ObjectList.RemoveNode(pListNode);
  2602. }
  2603. }
  2604. m_wStatusArr[STATE_TRANSPARENT] = nHTime;
  2605. m_nCharStatus = GetCharStatus();
  2606. AddRefMsg(RM_CHARSTATUSCHANGED, m_sHitSpeed/*wparam*/, m_nCharStatus, 0, 0, NULL);
  2607. m_fHumHideMode = TRUE;
  2608. m_fFixedHideMode = TRUE;
  2609. return FALSE;
  2610. }
  2611. /* **************************************************************************************
  2612. 措篮脚贱
  2613.    ************************************************************************************** */
  2614. BOOL CCharObject::MagMakeGroupTransparent(int nX, int nY, int nHTime)
  2615. {
  2616. BOOL fFlag = FALSE;
  2617. CWHList<CCharObject*> ObjectList;
  2618. m_pMap->GetMapObject(nX, nY, 1, &ObjectList);
  2619. if (ObjectList.GetCount())
  2620. {
  2621. PLISTNODE pListNode = ObjectList.GetHead();
  2622. CCharObject* pTargetObject;
  2623. while (pListNode)
  2624. {
  2625. if (pTargetObject = ObjectList.GetData(pListNode))
  2626. {
  2627. if (IsProperFriend(pTargetObject))
  2628. {
  2629. if (pTargetObject->m_wStatusArr[STATE_TRANSPARENT] == 0)
  2630. {
  2631. AddDelayProcess(pTargetObject, RM_TRANSPARENT, 0, nHTime, 0, 0, NULL, 800);
  2632. fFlag = TRUE;
  2633. }
  2634. }
  2635. }
  2636. pListNode = ObjectList.RemoveNode(pListNode);
  2637. }
  2638. }
  2639. return fFlag;
  2640. }
  2641. /* **************************************************************************************
  2642. 荤磊辣雀
  2643.    ************************************************************************************** */
  2644. BOOL CCharObject::MagTurnUndead(CCharObject* pTargetObject, int nX, int nY, int nLevel)
  2645. {
  2646. CMonsterObject *pMonsterObject = (CMonsterObject*)pTargetObject;
  2647. if (pMonsterObject->m_btLifeAttrib == LA_UNDEAD)
  2648. {
  2649. pMonsterObject->Struck(this);
  2650. // if (pTargetObject->m_pTargetObject == NULL)
  2651. // {
  2652. //         TAnimal(target).BoRunAwayMode := TRUE;
  2653. //         TAnimal(target).RunAwayStart := GetTickCount;
  2654. //         TAnimal(target).RunAwayTime := 10 * 1000;
  2655. // }
  2656. SelectTarget(pMonsterObject);
  2657. if ((pMonsterObject->m_Ability.Level < m_Ability.Level - 1 + (rand() % 4)) && (pMonsterObject->m_Ability.Level < 50))
  2658. {
  2659. int nlvGap = m_Ability.Level - pMonsterObject->m_Ability.Level;
  2660. if (rand() % 100 < (15 + nLevel * 7 + nlvGap))
  2661. {
  2662. pMonsterObject->SetLastHiter(this);
  2663. pMonsterObject->m_WAbility.HP = 0;
  2664. return TRUE;
  2665. }
  2666. }
  2667. }
  2668. return FALSE;
  2669. }
  2670. void CCharObject::SendSocket(_LPTDEFAULTMESSAGE lpDefMsg, char *pszPacket)
  2671. {
  2672. DWORD dwBytesSends = 0;
  2673. _TMSGHEADER MsgHdr;
  2674. _LPTSENDBUFF lpSendBuff = new _TSENDBUFF;
  2675. MsgHdr.nCode = 0xAA55AA55;
  2676. MsgHdr.wIdent = GM_DATA;
  2677. MsgHdr.wUserGateIndex = m_pUserInfo->m_nUserGateIndex;
  2678. MsgHdr.wUserListIndex = m_pUserInfo->m_nUserServerIndex;
  2679. MsgHdr.nSocket = m_pUserInfo->m_sock;
  2680. if (lpDefMsg)
  2681. {
  2682. if (pszPacket)
  2683. {
  2684. int nLength = memlen(pszPacket);
  2685. if (nLength >= 8096) 
  2686. {
  2687. InsertLogMsg(_TEXT("SendSocket:Packet is too long."));
  2688. return;
  2689. }
  2690. MsgHdr.nLength = sizeof(_TDEFAULTMESSAGE) + nLength;
  2691. lpSendBuff->nLen = sizeof(_TMSGHEADER) + MsgHdr.nLength;
  2692. memmove(lpSendBuff->szData, (char *)&MsgHdr, sizeof(_TMSGHEADER));
  2693. memmove(&lpSendBuff->szData[sizeof(_TMSGHEADER)], lpDefMsg, sizeof(_TDEFAULTMESSAGE));
  2694. memmove(&lpSendBuff->szData[sizeof(_TMSGHEADER) + sizeof(_TDEFAULTMESSAGE)], pszPacket, MsgHdr.nLength - sizeof(_TDEFAULTMESSAGE));
  2695. lpSendBuff->szData[lpSendBuff->nLen] = '';
  2696. }
  2697. else
  2698. {
  2699. MsgHdr.nLength = sizeof(_TDEFAULTMESSAGE);
  2700. lpSendBuff->nLen = sizeof(_TMSGHEADER) + MsgHdr.nLength;
  2701. memmove(lpSendBuff->szData, (char *)&MsgHdr, sizeof(_TMSGHEADER));
  2702. memmove(&lpSendBuff->szData[sizeof(_TMSGHEADER)], lpDefMsg, sizeof(_TDEFAULTMESSAGE));
  2703. lpSendBuff->szData[lpSendBuff->nLen] = '';
  2704. }
  2705. }
  2706. else
  2707. {
  2708. int nLen = (memlen(pszPacket) - 1);
  2709. MsgHdr.nLength = -(nLen);
  2710. lpSendBuff->nLen = sizeof(_TMSGHEADER) + nLen;
  2711. memmove(lpSendBuff->szData, (char *)&MsgHdr, sizeof(_TMSGHEADER));
  2712. memmove(&lpSendBuff->szData[sizeof(_TMSGHEADER)], pszPacket, nLen);
  2713. lpSendBuff->szData[lpSendBuff->nLen] = '';
  2714. }
  2715. m_pUserInfo->m_pGateInfo->m_xSendBuffQ.PushQ((BYTE *)lpSendBuff);
  2716. // m_pUserInfo->m_pGateInfo->Send(lpSendBuff);
  2717. }
  2718. void CCharObject::GetQueryUserName(CCharObject* pObject, int nX, int nY)
  2719. {
  2720. _TDEFAULTMESSAGE DefMsg;
  2721. char szEncodeMsg[32];
  2722. char szCharName[64];
  2723. pObject->GetCharName(szCharName);
  2724. fnMakeDefMessage(&DefMsg, SM_USERNAME, (int)pObject, pObject->GetThisCharColor(), 0, 0);
  2725. int nPos = fnEncode6BitBufA((unsigned char *)szCharName, szEncodeMsg, memlen(szCharName) - 1, sizeof(szEncodeMsg));
  2726. szEncodeMsg[nPos] = '';
  2727. SendSocket(&DefMsg, szEncodeMsg);
  2728. /*procedure TUserHuman.GetQueryUserName (target: TCreature; x, y: integer);
  2729. var
  2730.    uname: string;
  2731.    tagcolor: integer;
  2732. begin
  2733.    if CretInNearXY (target, x, y) then begin
  2734.       tagcolor := GetThisCharColor (target);
  2735.       Def := MakeDefaultMsg (SM_USERNAME, Integer(target), tagcolor, 0, 0);
  2736.       uname := target.GetUserName;
  2737.       SendSocket (@Def, EncodeString (uname));
  2738.    end else
  2739.       SendDefMessage (SM_GHOST, integer(target), x, y, 0, '');
  2740. end; */
  2741. }