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

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KObj.cpp
  5. // Date: 2002.01.06
  6. // Code: 边城浪子
  7. // Desc: Obj Class
  8. //---------------------------------------------------------------------------
  9. #include "KCore.h"
  10. #include "KNpc.h"
  11. #include "KPlayer.h"
  12. #include "KSubWorld.h"
  13. #include "KItemSet.h"
  14. #include "LuaFuns.h"
  15. #include "KSortScript.h"
  16. #ifdef _SERVER
  17. //#include "KNetServer.h"
  18. //#include "../MultiServer/Heaven/Interface/iServer.h"
  19. #else
  20. #include "../../Represent/iRepresent/iRepresentshell.h"
  21. #include "scene/KScenePlaceC.h"
  22. #include "ImgRef.h"
  23. #include "KOption.h"
  24. #endif
  25. #include "KObj.h"
  26. #define OBJ_SHOW_NAME_Y_OFF 48
  27. KObj Object[MAX_OBJECT];
  28. //-------------------------------------------------------------------------
  29. // 功能: 初始化
  30. //-------------------------------------------------------------------------
  31. KObj::KObj()
  32. {
  33. Release();
  34. }
  35. //-------------------------------------------------------------------------
  36. // 功能: 物件清空
  37. //-------------------------------------------------------------------------
  38. void KObj::Release()
  39. {
  40. m_nID = -1;
  41. m_nKind = 0;
  42. m_nBelongRegion = -1;
  43. m_nIndex = 0;
  44. m_nSubWorldID = 0;
  45. m_nRegionIdx = 0;
  46. m_nMapX = 0;
  47. m_nMapY = 0;
  48. m_nOffX = 0;
  49. m_nOffY = 0;
  50. m_nDir = 0;
  51. #ifndef _SERVER
  52. m_nLayer = 1;
  53. m_nHeight = 0;
  54. m_sObjLight.Release();
  55. m_Image.uImage = 0;
  56. m_SceneID = 0;
  57. #endif
  58. m_nState = 0;
  59. m_nLifeTime = 0;
  60. m_nBornTime = 0;
  61. m_nWaitTime = 0;
  62. m_cSkill.Release();
  63. #ifdef _SERVER
  64. if (m_nItemDataID)
  65. {
  66. ItemSet.Remove(m_nItemDataID);
  67. }
  68. #endif
  69. m_nItemDataID = 0;
  70. m_nItemWidth = 0;
  71. m_nItemHeight = 0;
  72. m_nMoneyNum = 0;
  73. m_szName[0] = 0;
  74. m_dwScriptID = 0;
  75. this->m_nColorID = 0;
  76. #ifdef _SERVER
  77. m_nBelong = -1;
  78. m_nBelongTime = 0;
  79. m_cImage.Release();
  80. #endif
  81. #ifndef _SERVER
  82. m_szImageName[0] = 0;
  83. m_szImageDropName[0]= 0;
  84. m_szSoundName[0] = 0;
  85. m_nDropState = 0;
  86. m_cImage.Release();
  87. m_cImageDrop.Release();
  88. this->m_dwNameColor = 0x00ffffff;
  89. #endif
  90. m_dwTimer = 0;
  91. memset(m_btBar, 0, sizeof(m_btBar));
  92. Polygon.Clear();
  93. #ifndef _SERVER
  94. m_pSoundNode = NULL;
  95. m_pWave = NULL;
  96. #endif
  97. }
  98. /*
  99. //-------------------------------------------------------------------------
  100. // 功能: 保存物件信息到 ini 文件
  101. //-------------------------------------------------------------------------
  102. void KObj::Save(KIniFile *IniFile, LPSTR Section)
  103. {
  104. IniFile->WriteString(Section, "ObjName", m_szName);
  105. IniFile->WriteInteger(Section, "DataID", m_nDataID);
  106. IniFile->WriteInteger(Section, "Kind", m_nKind);
  107. IniFile->WriteInteger(Section, "Dir", m_nDir);
  108. IniFile->WriteInteger(Section, "State", m_nState);
  109. IniFile->WriteInteger(Section, "LifeTime", m_nLifeTime);
  110. IniFile->WriteInteger(Section, "BornTime", m_nBornTime);
  111. IniFile->WriteInteger(Section, "WaitTime", m_nWaitTime);
  112. IniFile->WriteInteger(Section, "SkillKind", m_cSkill.m_nKind);
  113. IniFile->WriteInteger(Section, "SkillCamp", m_cSkill.m_nCamp);
  114. IniFile->WriteInteger(Section, "SkillRange", m_cSkill.m_nRange);
  115. IniFile->WriteInteger(Section, "SkillCastTime", m_cSkill.m_nCastTime);
  116. IniFile->WriteInteger(Section, "SkillID", m_cSkill.m_nID);
  117. IniFile->WriteInteger(Section, "SkillLevel", m_cSkill.m_nLevel);
  118. IniFile->WriteString(Section, "ScriptFile", m_szScriptName);
  119. IniFile->WriteInteger(Section, "ItemDataID", m_nItemDataID);
  120. IniFile->WriteInteger(Section, "ItemWidth", m_nItemWidth);
  121. IniFile->WriteInteger(Section, "ItemHeight", m_nItemHeight);
  122. IniFile->WriteInteger(Section, "Money", m_nMoneyNum);
  123. #ifndef _SERVER
  124. IniFile->WriteInteger(Section, "Layer", m_nLayer);
  125. IniFile->WriteInteger(Section, "Height", m_nHeight);
  126. IniFile->WriteInteger(Section, "LightRadius", m_sObjLight.m_nRadius);
  127. IniFile->WriteInteger(Section, "Red", m_sObjLight.m_nRed);
  128. IniFile->WriteInteger(Section, "Green", m_sObjLight.m_nGreen);
  129. IniFile->WriteInteger(Section, "Blue", m_sObjLight.m_nBlue);
  130. IniFile->WriteInteger(Section, "Alpha", m_sObjLight.m_nAlpha);
  131. IniFile->WriteInteger(Section, "Reflect", m_sObjLight.m_nReflectType);
  132. #endif
  133. #ifdef _SERVER
  134. IniFile->WriteInteger(Section, "TotalFrmae", m_cImage.m_nTotalFrame);
  135. IniFile->WriteInteger(Section, "CurFrmae", m_cImage.m_nCurFrame);
  136. IniFile->WriteInteger(Section, "TotalDir", m_cImage.m_nTotalDir);
  137. IniFile->WriteInteger(Section, "CurDir", m_cImage.m_nCurDir);
  138. IniFile->WriteInteger(Section, "Interval", m_cImage.m_dwInterval);
  139. #endif
  140. #ifndef _SERVER
  141. IniFile->WriteString(Section, "ImageFile", m_szImageName);
  142. IniFile->WriteString(Section, "SoundFile", m_szSoundName);
  143. IniFile->WriteInteger(Section, "TotalFrmae", m_cImage.m_nTotalFrame);
  144. IniFile->WriteInteger(Section, "CurFrmae", m_cImage.m_nCurFrame);
  145. IniFile->WriteInteger(Section, "TotalDir", m_cImage.m_nTotalDir);
  146. IniFile->WriteInteger(Section, "CurDir", m_cImage.m_nCurDir);
  147. IniFile->WriteInteger(Section, "Interval", (int)m_cImage.m_dwInterval);
  148. IniFile->WriteInteger(Section, "CenterX", m_cImage.m_nCgXpos);
  149. IniFile->WriteInteger(Section, "CenterY", m_cImage.m_nCgYpos);
  150. #endif
  151. int x, y;
  152. SubWorld[m_nSubWorldID].Map2Mps(m_nRegionIdx, m_nMapX, m_nMapY, m_nOffX, m_nOffY, &x, &y);
  153. IniFile->WriteInteger(Section, "PosX", x);
  154. IniFile->WriteInteger(Section, "PosY", y);
  155. IniFile->WriteStruct(Section, "ObjBar", m_btBar, sizeof(m_btBar));
  156. IniFile->WriteStruct(Section, "Polygon", Polygon.GetPolygonPtr(), sizeof(TPolygon));
  157. }
  158. //-------------------------------------------------------------------------
  159. // 功能: 从 ini 文件中读取物件信息
  160. //-------------------------------------------------------------------------
  161. void KObj::Load(int nObjIndex, int nSubWorldID, KIniFile *IniFile, LPSTR Section)
  162. {
  163. IniFile->GetString(Section, "ObjName", "", m_szName, sizeof(m_szName));
  164. IniFile->GetInteger(Section, "DataID", 0, &m_nDataID);
  165. IniFile->GetInteger(Section, "Kind", Obj_Kind_MapObj, &m_nKind);
  166. IniFile->GetInteger(Section, "Dir", 0, &m_nDir);
  167. IniFile->GetInteger(Section, "State", 0, &m_nState);
  168. IniFile->GetInteger(Section, "LifeTime", 0, &m_nLifeTime);
  169. IniFile->GetInteger(Section, "BornTime", 0, &m_nBornTime);
  170. IniFile->GetInteger(Section, "WaitTime", 0, &m_nWaitTime);
  171. IniFile->GetInteger(Section, "SkillKind", 0, &m_cSkill.m_nKind);
  172. IniFile->GetInteger(Section, "SkillCamp", camp_animal, &m_cSkill.m_nCamp);
  173. IniFile->GetInteger(Section, "SkillRange", 0, &m_cSkill.m_nRange);
  174. IniFile->GetInteger(Section, "SkillCastTime", 0, &m_cSkill.m_nCastTime);
  175. IniFile->GetInteger(Section, "SkillID", 0, &m_cSkill.m_nID);
  176. IniFile->GetInteger(Section, "SkillLevel", 0, &m_cSkill.m_nLevel);
  177. IniFile->GetString(Section, "ScriptFile", "", m_szScriptName, sizeof(m_szScriptName));
  178. IniFile->GetInteger(Section, "ItemDataID", 0, &m_nItemDataID);
  179. IniFile->GetInteger(Section, "ItemWidth", 0, &m_nItemWidth);
  180. IniFile->GetInteger(Section, "ItemHeight", 0, &m_nItemHeight);
  181. IniFile->GetInteger(Section, "Money", 0, &m_nMoneyNum);
  182. #ifndef _SERVER
  183. IniFile->GetInteger(Section, "Layer", 1, &m_nLayer);
  184. IniFile->GetInteger(Section, "Height", 0, &m_nHeight);
  185. IniFile->GetInteger(Section, "LightRadius", 0, &m_sObjLight.m_nRadius);
  186. IniFile->GetInteger(Section, "Red", 0, &m_sObjLight.m_nRed);
  187. IniFile->GetInteger(Section, "Green", 0, &m_sObjLight.m_nGreen);
  188. IniFile->GetInteger(Section, "Blue", 0, &m_sObjLight.m_nBlue);
  189. IniFile->GetInteger(Section, "Alpha", 0, &m_sObjLight.m_nAlpha);
  190. IniFile->GetInteger(Section, "Reflect", 0, &m_sObjLight.m_nReflectType);
  191. #endif
  192. #ifdef _SERVER
  193. int nTotalFrame, nTotalDir, nInterval, nCurFrame, nCurDir;
  194. IniFile->GetInteger(Section, "TotalFrmae", 1, &nTotalFrame);
  195. IniFile->GetInteger(Section, "CurFrmae", 0, &nCurFrame);
  196. IniFile->GetInteger(Section, "TotalDir", 1, &nTotalDir);
  197. IniFile->GetInteger(Section, "CurDir", 0, &nCurDir);
  198. IniFile->GetInteger(Section, "Interval", 1, &nInterval);
  199. m_cImage.SetTotalFrame(nTotalFrame);
  200. m_cImage.SetTotalDir(nTotalDir);
  201. m_cImage.SetCurFrame(nCurFrame);
  202. m_cImage.SetCurDir(nCurDir);
  203. m_cImage.SetInterVal(nInterval);
  204. #endif
  205. #ifndef _SERVER
  206. int nCgX, nCgY, nTotalFrame, nTotalDir, nInterval, nCurFrame, nCurDir;
  207. IniFile->GetString(Section, "ImageFile", "", m_szImageName, sizeof(m_szImageName));
  208. IniFile->GetString(Section, "SoundFile", "", m_szSoundName, sizeof(m_szSoundName));
  209. IniFile->GetInteger(Section, "TotalFrmae", 1, &nTotalFrame);
  210. IniFile->GetInteger(Section, "CurFrmae", 0, &nCurFrame);
  211. IniFile->GetInteger(Section, "TotalDir", 1, &nTotalDir);
  212. IniFile->GetInteger(Section, "CurDir", 0, &nCurDir);
  213. IniFile->GetInteger(Section, "Interval", 1, &nInterval);
  214. IniFile->GetInteger(Section, "CenterX", 0, &nCgX);
  215. IniFile->GetInteger(Section, "CenterY", 0, &nCgY);
  216. m_cImage.SetFileName(m_szImageName);
  217. m_cImage.SetTotalFrame(nTotalFrame);
  218. m_cImage.SetTotalDir(nTotalDir);
  219. m_cImage.SetCurFrame(nCurFrame);
  220. m_cImage.SetCurDir(nCurDir);
  221. m_cImage.SetInterVal((DWORD)nInterval);
  222. m_cImage.SetCenterPos(nCgX, nCgY);
  223. #endif
  224. int x, y;
  225. IniFile->GetInteger(Section, "PosX", 0, &x);
  226. IniFile->GetInteger(Section, "PosY", 0, &y);
  227. m_nSubWorldID = nSubWorldID;
  228. SubWorld[m_nSubWorldID].Mps2Map(x, y, &m_nRegionIdx, &m_nMapX, &m_nMapY,&m_nOffX, &m_nOffY);
  229. IniFile->GetStruct(Section, "ObjBar", m_btBar, sizeof(m_btBar));
  230. IniFile->GetStruct(Section, "Polygon", Polygon.GetPolygonPtr(), sizeof(TPolygon));
  231. SetIndex(nObjIndex);
  232. SetDir(m_nDir);
  233. SetState(m_nState);
  234. }
  235. */
  236. //-------------------------------------------------------------------------
  237. // 功能: 设定物件的索引值
  238. //-------------------------------------------------------------------------
  239. void KObj::SetIndex(int nIndex)
  240. {
  241. if (nIndex >= 0)
  242. m_nIndex = nIndex;
  243. else
  244. m_nIndex = 0;
  245. }
  246. //-------------------------------------------------------------------------
  247. // 功能: 设定物件世界唯一 ID (注:只在客户端存在的物件其 ID 统一为 0)
  248. //-------------------------------------------------------------------------
  249. void KObj::SetWorldID(int nID)
  250. {
  251. if (nID < 0)
  252. m_nID = 0;
  253. else
  254. m_nID = nID;
  255. }
  256. //-------------------------------------------------------------------------
  257. // 功能: 设定物件的生命时间 (注:只对尸体、装备等类型物件有效)
  258. //-------------------------------------------------------------------------
  259. void KObj::SetLifeTime(int nLifeTime)
  260. {
  261. if (nLifeTime < 0)
  262. return;
  263. m_nLifeTime = nLifeTime;
  264. }
  265. //-------------------------------------------------------------------------
  266. // 功能: 设定物件状态
  267. //-------------------------------------------------------------------------
  268. void KObj::SetState(int nState, int nPlaySoundFlag/* = 0*/)
  269. {
  270. if (nState < 0)
  271. return;
  272. m_nState = nState;
  273. switch (m_nKind)
  274. {
  275. case Obj_Kind_Box:
  276. if (nState == OBJ_BOX_STATE_CLOSE)
  277. BoxClose();
  278. else if (nState == OBJ_BOX_STATE_OPEN)
  279. BoxOpen();
  280. break;
  281. case Obj_Kind_Door:
  282. if (nState == OBJ_DOOR_STATE_CLOSE)
  283. DoorClose();
  284. else if (nState == OBJ_DOOR_STATE_OPEN)
  285. DoorOpen();
  286. break;
  287. case Obj_Kind_Prop:
  288. if (nState == OBJ_PROP_STATE_HIDE)
  289. {
  290. m_nBornTime = m_nLifeTime;
  291. }
  292. break;
  293. }
  294. #ifndef _SERVER
  295. if (nPlaySoundFlag)
  296. PlaySound();
  297. #endif
  298. #ifdef _SERVER
  299. SyncState();
  300. #endif
  301. }
  302. //-------------------------------------------------------------------------
  303. // 功能: 宝箱打开
  304. //-------------------------------------------------------------------------
  305. void KObj::BoxOpen()
  306. {
  307. #ifndef _SERVER
  308. if (m_nState != 1)
  309. PlaySound();
  310. #endif
  311. m_nState = 1;
  312. m_nBornTime = m_nLifeTime;
  313. }
  314. //-------------------------------------------------------------------------
  315. // 功能: 宝箱关闭
  316. //-------------------------------------------------------------------------
  317. void KObj::BoxClose()
  318. {
  319. #ifndef _SERVER
  320. if (m_nState != 0)
  321. PlaySound();
  322. #endif
  323. m_nState = 0;
  324. m_nBornTime = 0;
  325. }
  326. //-------------------------------------------------------------------------
  327. // 功能: 门打开
  328. //-------------------------------------------------------------------------
  329. void KObj::DoorOpen()
  330. {
  331. #ifndef _SERVER
  332. if (m_nState != 1)
  333. PlaySound();
  334. #endif
  335. m_nState = 1;
  336. // 缺少处理物件障碍
  337. }
  338. //-------------------------------------------------------------------------
  339. // 功能: 门关闭
  340. //-------------------------------------------------------------------------
  341. void KObj::DoorClose()
  342. {
  343. #ifndef _SERVER
  344. if (m_nState != 0)
  345. PlaySound();
  346. #endif
  347. m_nState = 0;
  348. // 缺少处理物件障碍
  349. }
  350. BOOL KObj::SetDir(int n64Dir)
  351. {
  352. if (n64Dir < 0 || n64Dir >= 64)
  353. {
  354. n64Dir = 0;
  355. _ASSERT(0);
  356. }
  357. #ifdef _SERVER
  358. m_nDir = n64Dir;
  359. m_cImage.SetCurDir64(n64Dir);
  360. SyncDir();
  361. #else
  362. m_nDir = n64Dir;
  363. m_cImage.SetCurDir64(n64Dir);
  364. m_cImageDrop.SetCurDir64(n64Dir);
  365. #endif
  366. return TRUE;
  367. }
  368. void KObj::SetScriptFile(char *lpszScriptFile)
  369. {
  370. char szScript[80];
  371. if ( !lpszScriptFile || strlen(lpszScriptFile) >= sizeof(szScript))
  372. {
  373. g_DebugLog("[error]Script FileName Error!!!");
  374. }
  375. else
  376. {
  377. if (lpszScriptFile[0])
  378. {
  379. if (lpszScriptFile[0] == '.')
  380. g_StrCpyLen(szScript, &lpszScriptFile[1], sizeof(szScript));
  381. else
  382. g_StrCpyLen(szScript, lpszScriptFile, sizeof(szScript));
  383. g_StrLower(szScript);
  384. m_dwScriptID = g_FileName2Id(szScript);
  385. }
  386. }
  387. }
  388. void KObj::SetImageDir(int nDir)
  389. {
  390. #ifdef _SERVER
  391. m_cImage.SetCurDir(nDir);
  392. SetDir(m_cImage.m_nCurDir * 64 / m_cImage.m_nTotalDir);
  393. #else
  394. m_cImage.SetCurDir(nDir);
  395. SetDir(m_cImage.m_nCurDir * 64 / m_cImage.m_nTotalDir);
  396. #endif
  397. }
  398. #ifdef _SERVER
  399. void KObj::SetItemDataID(int nItemDataID)
  400. {
  401. if (nItemDataID >= 0)
  402. m_nItemDataID = nItemDataID;
  403. }
  404. #endif
  405. #ifndef _SERVER
  406. void KObj::DrawInfo()
  407. {
  408. // return;
  409. if (m_nKind != Obj_Kind_Item)// && m_nKind != Obj_Kind_Money)
  410. return;
  411. int nMpsX, nMpsY, nHeightOff;
  412. DWORD dwColor;
  413. GetMpsPos(&nMpsX, &nMpsY);
  414. nHeightOff = OBJ_SHOW_NAME_Y_OFF;
  415. dwColor = this->m_dwNameColor;
  416. g_pRepresent->OutputText(12, m_szName, KRF_ZERO_END, nMpsX - 12 * g_StrLen(m_szName) / 4, nMpsY, dwColor, 0, nHeightOff);
  417. }
  418. #endif
  419. #ifndef _SERVER
  420. //-------------------------------------------------------------------------
  421. // 功能: 物件绘制
  422. //-------------------------------------------------------------------------
  423. void KObj::Draw()
  424. {
  425. if ( m_nIndex <= 0 )
  426. return;
  427. if ( !m_cImage.CheckExist() )
  428. return;
  429. if (m_bDrawFlag)
  430. return;
  431. if (m_nRegionIdx < 0 || m_nRegionIdx >= 9)
  432. return;
  433. int x, y;
  434. SubWorld[m_nSubWorldID].Map2Mps(m_nRegionIdx, m_nMapX, m_nMapY, m_nOffX, m_nOffY, &x, &y);
  435. // SubWorld[m_nSubWorldID].Mps2Screen(&x, &y);
  436. m_Image.Color.Color_b.a = 255;
  437. m_Image.bRenderFlag = RUIMAGE_RENDER_FLAG_REF_SPOT;
  438. m_Image.bRenderStyle = IMAGE_RENDER_STYLE_ALPHA;
  439. m_Image.nISPosition = IMAGE_IS_POSITION_INIT;
  440. m_Image.nType = ISI_T_SPR;
  441. m_Image.oPosition.nZ = 0;
  442. if (m_nKind == Obj_Kind_Item && m_nDropState == 1) // 物品掉出动画
  443. {
  444. m_Image.nFrame = m_cImageDrop.m_nCurFrame;
  445. m_Image.oPosition.nX = x;// - m_cImageDrop.m_nCgXpos;
  446. m_Image.oPosition.nY = y;// - m_cImageDrop.m_nCgYpos * 2;
  447. strcpy(m_Image.szImage, m_cImageDrop.m_szName);
  448. }
  449. else
  450. {
  451. m_Image.nFrame = m_cImage.m_nCurFrame;
  452. m_Image.oPosition.nX = x;// - m_cImage.m_nCgXpos;
  453. m_Image.oPosition.nY = y;// - m_cImage.m_nCgYpos * 2;
  454. strcpy(m_Image.szImage, m_cImage.m_szName);
  455. }
  456. switch(m_nKind)
  457. {
  458. case Obj_Kind_MapObj:
  459. g_pRepresent->DrawPrimitives(1, &m_Image, RU_T_IMAGE, 0);
  460. break;
  461. case Obj_Kind_Prop:
  462. if ( m_nState == OBJ_PROP_STATE_DISPLAY )
  463. g_pRepresent->DrawPrimitives(1, &m_Image, RU_T_IMAGE, 0);
  464. break;
  465. default:
  466. g_pRepresent->DrawPrimitives(1, &m_Image, RU_T_IMAGE, 0);
  467. break;
  468. }
  469. #ifdef SWORDONLINE_SHOW_DBUG_INFO
  470. if (Player[CLIENT_PLAYER_INDEX].m_DebugMode)
  471. {
  472. KRULine Line;
  473. int nX, nY;
  474. SubWorld[0].Map2Mps(m_nRegionIdx, m_nMapX, m_nMapY, 0, 0, &nX, &nY);
  475. Line.Color.Color_dw = 0xffffffff;
  476. Line.oPosition.nZ = 0;
  477. Line.oEndPos.nZ = 0;
  478. Line.oPosition.nX = nX;
  479. Line.oPosition.nY = nY;
  480. Line.oEndPos.nX = nX + 32;
  481. Line.oEndPos.nY = nY + 32;
  482. g_pRepresent->DrawPrimitives(1, &Line, RU_T_LINE, 0);
  483. }
  484. #endif
  485. }
  486. #endif
  487. //-------------------------------------------------------------------------
  488. // 功能: 各种物件的处理
  489. //-------------------------------------------------------------------------
  490. void KObj::Activate()
  491. {
  492. if ( m_nIndex <= 0 )
  493. return;
  494. #ifdef _SERVER
  495. int nEnemyIndex, x, y;
  496. #else
  497. int nMask = IPOT_RL_OBJECT | IPOT_RL_INFRONTOF_ALL;
  498. #endif
  499. switch(m_nKind)
  500. {
  501. #ifndef _SERVER
  502. case Obj_Kind_MapObj: // 地图物件动画
  503. if (m_nState == 0) // 地图物件动画循环播放
  504. m_cImage.GetNextFrame();
  505. nMask = IPOT_RL_OBJECT | IPOT_RL_INFRONTOF_ALL;
  506. break;
  507. case Obj_Kind_Light: // 光源
  508. if (m_nState == 0)
  509. m_cImage.GetNextFrame();
  510. nMask = IPOT_RL_OBJECT | IPOT_RL_INFRONTOF_ALL;
  511. break;
  512. case Obj_Kind_LoopSound: // 循环音效
  513. PlayLoopSound();
  514. break;
  515. case Obj_Kind_RandSound: // 随机音效
  516. PlayRandSound();
  517. break;
  518. case Obj_Kind_Body: // 尸体逐渐消失
  519. m_cImage.GetNextFrame(FALSE); // 尸体动画单方向播放
  520. m_nLifeTime--;
  521. if (m_nLifeTime <= 0)
  522. Remove(FALSE);
  523. nMask = IPOT_RL_COVER_GROUND | IPOT_RL_INFRONTOF_ALL;
  524. break;
  525. #endif
  526. case Obj_Kind_Box: // 宝箱
  527. #ifdef _SERVER
  528. if (m_nState == OBJ_BOX_STATE_OPEN) // 宝箱关闭重生
  529. {
  530. m_nBornTime--;
  531. if (m_nBornTime <= 0)
  532. SetState(OBJ_BOX_STATE_CLOSE);
  533. }
  534. #else
  535. if (m_nState == OBJ_BOX_STATE_CLOSE)// 宝箱关闭状态
  536. m_cImage.GetPrevFrame(FALSE);
  537. else// if (m_nState == OBJ_BOX_STATE_OPEN)// 宝箱打开状态
  538. m_cImage.GetNextFrame(FALSE);
  539. nMask = IPOT_RL_OBJECT | IPOT_RL_INFRONTOF_ALL;
  540. #endif
  541. break;
  542. case Obj_Kind_Door: // 门
  543. #ifdef _SERVER
  544. #else
  545. if (m_nState == OBJ_DOOR_STATE_CLOSE)// 门关闭状态
  546. m_cImage.GetPrevFrame(FALSE);
  547. else// if (m_nState == OBJ_DOOR_STATE_OPEN)// 门打开状态
  548. m_cImage.GetNextFrame(FALSE);
  549. nMask = IPOT_RL_OBJECT | IPOT_RL_INFRONTOF_ALL;
  550. #endif
  551. break;
  552. case Obj_Kind_Item: // 装备动画循环播放
  553. #ifdef _SERVER
  554. if (m_nBelong >= 0)
  555. {
  556. m_nBelongTime--;
  557. if (m_nBelongTime <= 0)
  558. {
  559. m_nBelongTime = 0;
  560. m_nBelong = -1;
  561. }
  562. }
  563. m_nLifeTime--;
  564. if (m_nLifeTime <= 0)
  565. Remove(FALSE);
  566. #else
  567. if (this->m_nDropState == 1) // 物品掉出动画
  568. {
  569. if (m_cImageDrop.GetNextFrame(FALSE))
  570. {
  571. if (m_cImageDrop.CheckEnd())
  572. {
  573. m_nDropState = 0; // 物品掉出动画播放完了,改为放置循环动画
  574. m_Image.uImage = 0;
  575. }
  576. }
  577. nMask = IPOT_RL_OBJECT | IPOT_RL_INFRONTOF_ALL;
  578. }
  579. else
  580. {
  581. if (this->m_nDropState == 2)
  582. {
  583. if (m_cImage.GetNextFrame(FALSE))
  584. {
  585. if (m_cImage.CheckEnd())
  586. this->m_nDropState = 0;
  587. }
  588. }
  589. else
  590. {
  591. if (g_Random(40) == 0)
  592. {
  593. m_nDropState = 2;
  594. }
  595. else
  596. {
  597. m_cImage.SetDirStart();
  598. }
  599. }
  600. nMask = IPOT_RL_COVER_GROUND | IPOT_RL_INFRONTOF_ALL;
  601. }
  602. m_nLifeTime--;
  603. if (m_nLifeTime <= -100)
  604. Remove(FALSE);
  605. #endif
  606. break;
  607. case Obj_Kind_Money:
  608. #ifdef _SERVER
  609. if (m_nBelong >= 0)
  610. {
  611. m_nBelongTime--;
  612. if (m_nBelongTime <= 0)
  613. {
  614. m_nBelongTime = 0;
  615. m_nBelong = -1;
  616. }
  617. }
  618. m_nLifeTime--;
  619. if (m_nLifeTime <= 0)
  620. Remove(FALSE);
  621. #else
  622. m_cImage.GetNextFrame();
  623. nMask = IPOT_RL_COVER_GROUND | IPOT_RL_INFRONTOF_ALL;
  624. m_nLifeTime--;
  625. if (m_nLifeTime <= -100)
  626. Remove(FALSE);
  627. #endif
  628. break;
  629. case Obj_Kind_Prop:
  630. #ifdef _SERVER
  631. if (m_nState == OBJ_PROP_STATE_HIDE) // 道具隐藏状态
  632. {
  633. m_nBornTime--;
  634. if (m_nBornTime <= 0)
  635. SetState(OBJ_PROP_STATE_DISPLAY);// 道具重生
  636. }
  637. #else
  638. if (m_nState == OBJ_PROP_STATE_DISPLAY)
  639. {
  640. m_cImage.GetNextFrame();
  641. nMask = IPOT_RL_OBJECT | IPOT_RL_INFRONTOF_ALL;
  642. }
  643. #endif
  644. break;
  645. /*
  646. case Obj_Kind_Trap:
  647. switch (m_cSkill.m_nKind)
  648. {
  649. case ObjTrap_Kind_Cycle_Image_Static:
  650. if (m_nState == OBJ_TRAP_STATE_STOP)
  651. {
  652. if (m_nWaitTime > 0)
  653. {
  654. m_nWaitTime--;
  655. if (m_nWaitTime <= 0)
  656. {
  657. m_nWaitTime = 0;
  658. SetState(OBJ_TRAP_STATE_ACTIVE);
  659. }
  660. }
  661. #ifdef _SERVER
  662. m_cImage.SetDirStart();
  663. #else
  664. m_cImage.SetDirStart();
  665. #endif
  666. }
  667. else// if (m_nState == OBJ_TRAP_STATE_ACTIVE)
  668. {
  669. #ifdef _SERVER
  670. // 朝自身位置发射技能
  671. // if (m_cImage.GetCurDirFrameNo() == m_cSkill.m_nCastTime)
  672. // Skill[][].cast()
  673. m_cImage.GetNextFrame();
  674. #else
  675. // 朝自身位置发射技能
  676. // if (m_cImage.GetCurDirFrameNo() == m_cSkill.m_nCastTime)
  677. // Skill[][].cast()
  678. m_cImage.GetNextFrame();
  679. #endif
  680. }
  681. break;
  682. case ObjTrap_Kind_Cycle_Image_Dir:
  683. if (m_nState == OBJ_TRAP_STATE_STOP)
  684. {
  685. if (m_nWaitTime > 0)
  686. {
  687. m_nWaitTime--;
  688. if (m_nWaitTime <= 0)
  689. {
  690. m_nWaitTime = 0;
  691. SetState(OBJ_TRAP_STATE_ACTIVE);
  692. }
  693. }
  694. #ifdef _SERVER
  695. m_cImage.SetDirStart();
  696. #else
  697. m_cImage.SetDirStart();
  698. #endif
  699. }
  700. else// if (m_nState == OBJ_TRAP_STATE_ACTIVE)
  701. {
  702. #ifdef _SERVER
  703. // 朝固定方向发射技能
  704. // if (m_cImage.GetCurDirFrameNo() == m_cSkill.m_nCastTime)
  705. // Skill[][].cast()
  706. m_cImage.GetNextFrame();
  707. #else
  708. // 朝固定方向发射技能
  709. // if (m_cImage.GetCurDirFrameNo() == m_cSkill.m_nCastTime)
  710. // Skill[][].cast()
  711. m_cImage.GetNextFrame();
  712. #endif
  713. }
  714. break;
  715. case ObjTrap_Kind_Auto_Image_Static:
  716. if (m_nState == OBJ_TRAP_STATE_STOP)
  717. break;
  718. #ifdef _SERVER
  719. if (m_nState == OBJ_TRAP_STATE_ACTIVE)
  720. {
  721. nEnemyIndex = FindEnemy();
  722. if (nEnemyIndex > 0)
  723. {
  724. Npc[nEnemyIndex].GetMpsPos(&x, &y);
  725. m_cSkill.m_nTarX = x;
  726. m_cSkill.m_nTarY = y;
  727. m_nState = OBJ_TRAP_STATE_ACTING;
  728. m_cImage.SetDirStart();
  729. // 通知客户端
  730. TrapAct();
  731. }
  732. }
  733. else if (m_nState == OBJ_TRAP_STATE_ACTING)
  734. {
  735. // 朝固定位置发射技能
  736. // if (m_cImage.m_nCurFrame == m_cSkill.m_nCastTime)
  737. // Skill[][].cast
  738. m_cImage.GetNextFrame(FALSE);
  739. if (m_cImage.CheckEnd())
  740. {
  741. m_nState = OBJ_TRAP_STATE_ACTIVE;
  742. m_cImage.SetDirStart();
  743. }
  744. }
  745. #else
  746. if (m_nState == OBJ_TRAP_STATE_ACTING)
  747. {
  748. // 朝自身位置发射技能
  749. // if (m_cImage.GetCurDirFrameNo() == m_cSkill.m_nCastTime)
  750. // Skill[][].cast()
  751. m_cImage.GetNextFrame(FALSE);
  752. if (m_cImage.CheckEnd())
  753. {
  754. m_nState = OBJ_TRAP_STATE_ACTIVE;
  755. m_cImage.SetDirStart();
  756. }
  757. }
  758. #endif
  759. break;
  760. case ObjTrap_Kind_Auto_Image_Dir:
  761. if (m_nState == OBJ_TRAP_STATE_STOP)
  762. break;
  763. #ifdef _SERVER
  764. if (m_nState == OBJ_TRAP_STATE_ACTIVE)
  765. {
  766. nEnemyIndex = FindEnemy();
  767. if (nEnemyIndex > 0)
  768. {
  769. Npc[nEnemyIndex].GetMpsPos(&x, &y);
  770. m_cSkill.m_nTarX = x;
  771. m_cSkill.m_nTarY = y;
  772. m_nState = OBJ_TRAP_STATE_ACTING;
  773. m_cImage.SetDirStart();
  774. // 通知客户端
  775. TrapAct();
  776. }
  777. }
  778. else if (m_nState == OBJ_TRAP_STATE_ACTING)
  779. {
  780. // 朝固定方向发射技能
  781. // if (m_cImage.m_nCurFrame == m_cSkill.m_nCastTime)
  782. // Skill[][].cast
  783. m_cImage.GetNextFrame(FALSE);
  784. if (m_cImage.CheckEnd())
  785. {
  786. m_nState = OBJ_TRAP_STATE_ACTIVE;
  787. m_cImage.SetDirStart();
  788. }
  789. }
  790. #else
  791. if (m_nState == OBJ_TRAP_STATE_ACTING)
  792. {
  793. // 朝固定方向发射技能
  794. // if (m_cImage.GetCurDirFrameNo() == m_cSkill.m_nCastTime)
  795. // Skill[][].cast()
  796. m_cImage.GetNextFrame(FALSE);
  797. if (m_cImage.CheckEnd())
  798. {
  799. m_nState = OBJ_TRAP_STATE_ACTIVE;
  800. m_cImage.SetDirStart();
  801. }
  802. }
  803. #endif
  804. break;
  805. case ObjTrap_Kind_Auto_Image_Target:
  806. if (m_nState == OBJ_TRAP_STATE_STOP)
  807. break;
  808. #ifdef _SERVER
  809. if (m_nState == OBJ_TRAP_STATE_ACTIVE)
  810. {
  811. nEnemyIndex = FindEnemy();
  812. if (nEnemyIndex > 0)
  813. {
  814. Npc[nEnemyIndex].GetMpsPos(&x, &y);
  815. m_cSkill.m_nTarX = x;
  816. m_cSkill.m_nTarY = y;
  817. m_nState = OBJ_TRAP_STATE_ACTING;
  818. m_cImage.SetDirStart();
  819. // 通知客户端
  820. TrapAct();
  821. }
  822. }
  823. else if (m_nState == OBJ_TRAP_STATE_ACTING)
  824. {
  825. // 朝目标点发射技能
  826. // if (m_cImage.m_nCurFrame == m_cSkill.m_nCastTime)
  827. // Skill[][].cast
  828. m_cImage.GetNextFrame(FALSE);
  829. if (m_cImage.CheckEnd())
  830. {
  831. m_nState = OBJ_TRAP_STATE_ACTIVE;
  832. m_cImage.SetDirStart();
  833. }
  834. }
  835. #else
  836. if (m_nState == OBJ_TRAP_STATE_ACTING)
  837. {
  838. // 朝目标点发射技能
  839. // if (m_cImage.GetCurDirFrameNo() == m_cSkill.m_nCastTime)
  840. // Skill[][].cast()
  841. m_cImage.GetNextFrame(FALSE);
  842. if (m_cImage.CheckEnd())
  843. {
  844. m_nState = OBJ_TRAP_STATE_ACTIVE;
  845. m_cImage.SetDirStart();
  846. }
  847. }
  848. #endif
  849. break;
  850. case ObjTrap_Kind_Auto_Delay_Static:
  851. if (m_nState == OBJ_TRAP_STATE_STOP)
  852. break;
  853. #ifdef _SERVER
  854. if (m_nState == OBJ_TRAP_STATE_ACTIVE)
  855. {
  856. if (m_nWaitTime > 0)
  857. {
  858. m_nWaitTime--;
  859. }
  860. else
  861. {
  862. nEnemyIndex = FindEnemy();
  863. if (nEnemyIndex > 0)
  864. {
  865. Npc[nEnemyIndex].GetMpsPos(&x, &y);
  866. m_cSkill.m_nTarX = x;
  867. m_cSkill.m_nTarY = y;
  868. m_nState = OBJ_TRAP_STATE_ACTING;
  869. // 通知客户端
  870. TrapAct();
  871. // 朝自身位置发射技能
  872. //Skill[][].cast();
  873. m_nState = OBJ_TRAP_STATE_ACTIVE;
  874. m_nWaitTime = m_cSkill.m_nCastTime;
  875. }
  876. }
  877. }
  878. #else
  879. if (m_nState == OBJ_TRAP_STATE_ACTING)
  880. {
  881. // 朝自身位置发射技能
  882. // Skill[][].cast()
  883. m_nState = OBJ_TRAP_STATE_ACTIVE;
  884. }
  885. m_cImage.GetNextFrame();
  886. #endif
  887. break;
  888. case ObjTrap_Kind_Auto_Delay_Dir:
  889. if (m_nState == OBJ_TRAP_STATE_STOP)
  890. break;
  891. #ifdef _SERVER
  892. if (m_nState == OBJ_TRAP_STATE_ACTIVE)
  893. {
  894. if (m_nWaitTime > 0)
  895. {
  896. m_nWaitTime--;
  897. }
  898. else
  899. {
  900. nEnemyIndex = FindEnemy();
  901. if (nEnemyIndex > 0)
  902. {
  903. Npc[nEnemyIndex].GetMpsPos(&x, &y);
  904. m_cSkill.m_nTarX = x;
  905. m_cSkill.m_nTarY = y;
  906. m_nState = OBJ_TRAP_STATE_ACTING;
  907. // 通知客户端
  908. TrapAct();
  909. // 朝固定方向发射技能
  910. //Skill[][].cast();
  911. m_nState = OBJ_TRAP_STATE_ACTIVE;
  912. m_nWaitTime = m_cSkill.m_nCastTime;
  913. }
  914. }
  915. }
  916. #else
  917. if (m_nState == OBJ_TRAP_STATE_ACTING)
  918. {
  919. // 朝固定方向发射技能
  920. // Skill[][].cast()
  921. m_nState = OBJ_TRAP_STATE_ACTIVE;
  922. }
  923. m_cImage.GetNextFrame();
  924. #endif
  925. break;
  926. case ObjTrap_Kind_Auto_Delay_Target:
  927. if (m_nState == OBJ_TRAP_STATE_STOP)
  928. break;
  929. #ifdef _SERVER
  930. if (m_nState == OBJ_TRAP_STATE_ACTIVE)
  931. {
  932. if (m_nWaitTime > 0)
  933. {
  934. m_nWaitTime--;
  935. }
  936. else
  937. {
  938. nEnemyIndex = FindEnemy();
  939. if (nEnemyIndex > 0)
  940. {
  941. Npc[nEnemyIndex].GetMpsPos(&x, &y);
  942. m_cSkill.m_nTarX = x;
  943. m_cSkill.m_nTarY = y;
  944. m_nState = OBJ_TRAP_STATE_ACTING;
  945. // 通知客户端
  946. TrapAct();
  947. // 朝目标点发射技能
  948. //Skill[][].cast();
  949. m_nState = OBJ_TRAP_STATE_ACTIVE;
  950. m_nWaitTime = m_cSkill.m_nCastTime;
  951. }
  952. }
  953. }
  954. #else
  955. if (m_nState == OBJ_TRAP_STATE_ACTING)
  956. {
  957. // 朝目标点发射技能
  958. // Skill[][].cast()
  959. m_nState = OBJ_TRAP_STATE_ACTIVE;
  960. }
  961. m_cImage.GetNextFrame();
  962. #endif
  963. break;
  964. }
  965. break;
  966. */
  967. }
  968. #ifndef _SERVER
  969. int nMpsX, nMpsY;
  970. SubWorld[m_nSubWorldID].Map2Mps(m_nRegionIdx, m_nMapX, m_nMapY, m_nOffX, m_nOffY, &nMpsX, &nMpsY);
  971. g_ScenePlace.MoveObject(CGOG_OBJECT, m_nIndex, nMpsX, nMpsY, 0, m_SceneID, nMask);
  972. #endif
  973. }
  974. #ifndef _SERVER
  975. //-------------------------------------------------------------------------
  976. // 功能: 播放循环音效
  977. //-------------------------------------------------------------------------
  978. void KObj::PlayLoopSound()
  979. {
  980. if (!m_szSoundName[0])
  981. return;
  982. m_pSoundNode = (KCacheNode*) g_SoundCache.GetNode(m_szSoundName, (KCacheNode * )m_pSoundNode);
  983. m_pWave = (KWavSound*)m_pSoundNode->m_lpData;
  984. if (m_pWave)
  985. {
  986. if (!m_pWave->IsPlaying())
  987. {
  988. m_pWave->Play(GetSoundPan(), GetSoundVolume(), 0);
  989. }
  990. else
  991. {
  992. m_pWave->SetPan(GetSoundPan());
  993. m_pWave->SetVolume(GetSoundVolume());
  994. }
  995. }
  996. }
  997. //-------------------------------------------------------------------------
  998. // 功能: 播放随机音效
  999. //-------------------------------------------------------------------------
  1000. void KObj::PlayRandSound()
  1001. {
  1002. if (!m_szSoundName[0])
  1003. return;
  1004. if (g_Random(500) != 0)
  1005. return;
  1006. m_pSoundNode = (KCacheNode*) g_SoundCache.GetNode(m_szSoundName, (KCacheNode * )m_pSoundNode);
  1007. m_pWave = (KWavSound*)m_pSoundNode->m_lpData;
  1008. if (m_pWave)
  1009. {
  1010. if (m_pWave->IsPlaying())
  1011. return;
  1012. m_pWave->Play(GetSoundPan(), GetSoundVolume(), 0);
  1013. }
  1014. }
  1015. //-------------------------------------------------------------------------
  1016. // 功能: 得到声音音相大小
  1017. //-------------------------------------------------------------------------
  1018. int KObj::GetSoundPan()
  1019. {
  1020. int nNpcX, nNpcY, nObjX, nObjY;
  1021. SubWorld[Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_SubWorldIndex].Map2Mps(
  1022. Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_RegionIndex,
  1023. Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_MapX,
  1024. Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_MapY,
  1025. Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_OffX,
  1026. Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_OffY,
  1027. &nNpcX,
  1028. &nNpcY);
  1029. SubWorld[m_nSubWorldID].Map2Mps(
  1030. m_nRegionIdx,
  1031. m_nMapX,
  1032. m_nMapY,
  1033. m_nOffX,
  1034. m_nOffY,
  1035. &nObjX,
  1036. &nObjY);
  1037. return (nObjX - nNpcX) * 5;
  1038. }
  1039. //-------------------------------------------------------------------------
  1040. // 功能: 得到声音音量大小
  1041. //-------------------------------------------------------------------------
  1042. int KObj::GetSoundVolume()
  1043. {
  1044. int nNpcX, nNpcY, nObjX, nObjY;
  1045. SubWorld[Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_SubWorldIndex].Map2Mps(
  1046. Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_RegionIndex,
  1047. Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_MapX,
  1048. Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_MapY,
  1049. Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_OffX,
  1050. Npc[Player[CLIENT_PLAYER_INDEX].m_nIndex].m_OffY,
  1051. &nNpcX,
  1052. &nNpcY);
  1053. SubWorld[m_nSubWorldID].Map2Mps(
  1054. m_nRegionIdx,
  1055. m_nMapX,
  1056. m_nMapY,
  1057. m_nOffX,
  1058. m_nOffY,
  1059. &nObjX,
  1060. &nObjY);
  1061. return ((10000 - (abs(nObjX - nNpcX) + abs(nObjY - nNpcY) * 2)) * Option.GetSndVolume() / 100) - 10000;
  1062. // return -((abs(nObjX - nNpcX) + abs(nObjY - nNpcY) * 2) * Option.GetSndVolume() / 100);
  1063. }
  1064. //-------------------------------------------------------------------------
  1065. // 功能: 播放声音
  1066. //-------------------------------------------------------------------------
  1067. void KObj::PlaySound()
  1068. {
  1069. if (!m_szSoundName[0])
  1070. return;
  1071. m_pSoundNode = (KCacheNode*) g_SoundCache.GetNode(m_szSoundName, (KCacheNode * )m_pSoundNode);
  1072. m_pWave = (KWavSound*)m_pSoundNode->m_lpData;
  1073. if (m_pWave)
  1074. {
  1075. if (m_pWave->IsPlaying())
  1076. return;
  1077. m_pWave->Play(GetSoundPan(), GetSoundVolume(), 0);
  1078. }
  1079. }
  1080. #endif
  1081. //-------------------------------------------------------------------------
  1082. // 功能: 运行物件脚本
  1083. //-------------------------------------------------------------------------
  1084. void KObj::ExecScript(int nPlayerIdx)
  1085. {
  1086. if (!m_dwScriptID)
  1087. return;
  1088. if (nPlayerIdx < 0)
  1089. return;
  1090. DWORD dwScriptId = m_dwScriptID;//g_FileName2Id(m_szScriptName);
  1091. KLuaScript * pScript = (KLuaScript*)g_GetScript(dwScriptId);
  1092. try
  1093. {
  1094. if (pScript)
  1095. {
  1096. if (Player[nPlayerIdx].m_nIndex < 0) return ;
  1097. Npc[Player[nPlayerIdx].m_nIndex].m_ActionScriptID = dwScriptId;
  1098. Lua_PushNumber(pScript->m_LuaState, Player[nPlayerIdx].GetPlayerIndex());
  1099. pScript->SetGlobalName(SCRIPT_PLAYERINDEX);
  1100. Lua_PushNumber(pScript->m_LuaState, Player[nPlayerIdx].GetPlayerID());
  1101. pScript->SetGlobalName(SCRIPT_PLAYERID);
  1102. Lua_PushNumber(pScript->m_LuaState, m_nIndex);
  1103. pScript->SetGlobalName(SCRIPT_OBJINDEX);
  1104. int nTopIndex = 0;
  1105. pScript->SafeCallBegin(&nTopIndex);
  1106. BOOL bResult = FALSE;
  1107. bResult = pScript->CallFunction("main", 0, "");
  1108. pScript->SafeCallEnd(nTopIndex);
  1109. }
  1110. }
  1111. catch(...)
  1112. {
  1113. printf("Exception Have Chought When Execute Obj Script[%d]!!!!!", dwScriptId);
  1114. }
  1115. return;
  1116. }
  1117. //-------------------------------------------------------------------------
  1118. // 功能: 朝方向发射子弹
  1119. //-------------------------------------------------------------------------
  1120. void KObj::CastSkill(int nDir)
  1121. {
  1122. if (m_cSkill.m_nID <= 0 || m_cSkill.m_nLevel < 0)
  1123. return;
  1124. // Skill[m_nID][m_nLevel].cast();
  1125. }
  1126. //-------------------------------------------------------------------------
  1127. // 功能: 朝目标点发射子弹
  1128. //-------------------------------------------------------------------------
  1129. void KObj::CastSkill(int nXpos, int nYpos)
  1130. {
  1131. if (m_cSkill.m_nID <= 0 || m_cSkill.m_nLevel < 0)
  1132. return;
  1133. // Skill[m_nID][m_nLevel].cast();
  1134. }
  1135. #ifdef _SERVER
  1136. BOOL KObj::SyncAdd(int nClient)
  1137. {
  1138. OBJ_ADD_SYNC cObjAdd;
  1139. int nTempX, nTempY;
  1140. cObjAdd.ProtocolType = (BYTE)s2c_objadd;
  1141. cObjAdd.m_nID = m_nID;
  1142. cObjAdd.m_nDataID = m_nDataID;
  1143. cObjAdd.m_btDir = m_nDir;
  1144. cObjAdd.m_btState = m_nState;
  1145. cObjAdd.m_wCurFrame = m_cImage.m_nCurFrame;
  1146. SubWorld[m_nSubWorldID].Map2Mps(m_nRegionIdx, m_nMapX, m_nMapY, m_nOffX, m_nOffY, &nTempX, &nTempY);
  1147. cObjAdd.m_nXpos = nTempX;
  1148. cObjAdd.m_nYpos = nTempY;
  1149. cObjAdd.m_nMoneyNum = m_nMoneyNum;
  1150. cObjAdd.m_nItemID = m_nItemDataID;
  1151. cObjAdd.m_btItemWidth = m_nItemWidth;
  1152. cObjAdd.m_btItemHeight = m_nItemHeight;
  1153. cObjAdd.m_btColorID = this->m_nColorID;
  1154. cObjAdd.m_btFlag = 0;
  1155. strcpy(cObjAdd.m_szName, this->m_szName);
  1156. cObjAdd.m_wLength = sizeof(OBJ_ADD_SYNC) - 1 - sizeof(cObjAdd.m_szName) + strlen(cObjAdd.m_szName);
  1157. g_pServer->PackDataToClient(nClient, (BYTE*)&cObjAdd, cObjAdd.m_wLength + 1);
  1158. return TRUE;
  1159. }
  1160. void KObj::SyncState()
  1161. {
  1162. OBJ_SYNC_STATE cObjState;
  1163. cObjState.ProtocolType = (BYTE)s2c_syncobjstate;
  1164. cObjState.m_nID = m_nID;
  1165. cObjState.m_btState = (BYTE)m_nState;
  1166. POINT POff[8] = 
  1167. {
  1168. {0, 32},
  1169. {-16, 32},
  1170. {-16, 0},
  1171. {-16, -32},
  1172. {0, -32},
  1173. {16, -32},
  1174. {16, 0},
  1175. {16, 32},
  1176. };
  1177. int nMaxCount = MAX_BROADCAST_COUNT;
  1178. SubWorld[m_nSubWorldID].m_Region[m_nRegionIdx].BroadCast((BYTE*)&cObjState, sizeof(OBJ_SYNC_STATE), nMaxCount, m_nMapX, m_nMapY);
  1179. int nConRegion;
  1180. for (int i = 0; i < 8; i++)
  1181. {
  1182. nConRegion = SubWorld[m_nSubWorldID].m_Region[m_nRegionIdx].m_nConnectRegion[i];
  1183. if (nConRegion == -1)
  1184. continue;
  1185. SubWorld[m_nSubWorldID].m_Region[nConRegion].BroadCast((BYTE*)&cObjState, sizeof(OBJ_SYNC_STATE), nMaxCount, m_nMapX - POff[i].x, m_nMapY - POff[i].y);
  1186. }
  1187. }
  1188. void KObj::SyncDir()
  1189. {
  1190. OBJ_SYNC_DIR cObjDir;
  1191. cObjDir.ProtocolType = (BYTE)s2c_syncobjdir;
  1192. cObjDir.m_nID = m_nID;
  1193. cObjDir.m_btDir = (BYTE)m_nDir;
  1194. POINT POff[8] = 
  1195. {
  1196. {0, 32},
  1197. {-16, 32},
  1198. {-16, 0},
  1199. {-16, -32},
  1200. {0, -32},
  1201. {16, -32},
  1202. {16, 0},
  1203. {16, 32},
  1204. };
  1205. int nMaxCount = MAX_BROADCAST_COUNT;
  1206. SubWorld[m_nSubWorldID].m_Region[m_nRegionIdx].BroadCast((BYTE*)&cObjDir, sizeof(OBJ_SYNC_DIR), nMaxCount, m_nMapX, m_nMapY);
  1207. int nConRegion;
  1208. for (int i = 0; i < 8; i++)
  1209. {
  1210. nConRegion = SubWorld[m_nSubWorldID].m_Region[m_nRegionIdx].m_nConnectRegion[i];
  1211. if (nConRegion == -1)
  1212. continue;
  1213. SubWorld[m_nSubWorldID].m_Region[nConRegion].BroadCast((BYTE*)&cObjDir, sizeof(OBJ_SYNC_DIR), nMaxCount, m_nMapX - POff[i].x, m_nMapY - POff[i].y);
  1214. }
  1215. }
  1216. void KObj::SyncRemove(BOOL bSoundFlag)
  1217. {
  1218. OBJ_SYNC_REMOVE cObjSyncRemove;
  1219. cObjSyncRemove.ProtocolType = (BYTE)s2c_objremove;
  1220. cObjSyncRemove.m_nID = m_nID;
  1221. cObjSyncRemove.m_btSoundFlag = bSoundFlag;
  1222. POINT POff[8] = 
  1223. {
  1224. {0, 32},
  1225. {-16, 32},
  1226. {-16, 0},
  1227. {-16, -32},
  1228. {0, -32},
  1229. {16, -32},
  1230. {16, 0},
  1231. {16, 32},
  1232. };
  1233. int nMaxCount = MAX_BROADCAST_COUNT;
  1234. SubWorld[m_nSubWorldID].m_Region[m_nRegionIdx].BroadCast((BYTE*)&cObjSyncRemove, sizeof(OBJ_SYNC_REMOVE), nMaxCount, m_nMapX, m_nMapY);
  1235. int nConRegion;
  1236. for (int i = 0; i < 8; i++)
  1237. {
  1238. nConRegion = SubWorld[m_nSubWorldID].m_Region[m_nRegionIdx].m_nConnectRegion[i];
  1239. if (nConRegion == -1)
  1240. continue;
  1241. SubWorld[m_nSubWorldID].m_Region[nConRegion].BroadCast((BYTE*)&cObjSyncRemove, sizeof(OBJ_SYNC_REMOVE), nMaxCount, m_nMapX - POff[i].x, m_nMapY - POff[i].y);
  1242. }
  1243. }
  1244. void KObj::TrapAct()
  1245. {
  1246. if (m_nKind != Obj_Kind_Trap || m_nState == OBJ_TRAP_STATE_STOP)
  1247. return;
  1248. OBJ_SYNC_TRAP_ACT cTrapAct;
  1249. cTrapAct.ProtocolType = (BYTE)s2c_objTrapAct;
  1250. cTrapAct.m_nID = m_nID;
  1251. cTrapAct.m_nTarX = m_cSkill.m_nTarX;
  1252. cTrapAct.m_nTarY = m_cSkill.m_nTarY;
  1253. POINT POff[8] = 
  1254. {
  1255. {0, 32},
  1256. {-16, 32},
  1257. {-16, 0},
  1258. {-16, -32},
  1259. {0, -32},
  1260. {16, -32},
  1261. {16, 0},
  1262. {16, 32},
  1263. };
  1264. int nMaxCount = MAX_BROADCAST_COUNT;
  1265. SubWorld[m_nSubWorldID].m_Region[m_nRegionIdx].BroadCast((BYTE*)&cTrapAct, sizeof(OBJ_SYNC_TRAP_ACT), nMaxCount, m_nMapX, m_nMapY);
  1266. int nConRegion;
  1267. for (int i = 0; i < 8; i++)
  1268. {
  1269. nConRegion = SubWorld[m_nSubWorldID].m_Region[m_nRegionIdx].m_nConnectRegion[i];
  1270. if (nConRegion == -1)
  1271. continue;
  1272. SubWorld[m_nSubWorldID].m_Region[nConRegion].BroadCast((BYTE*)&cTrapAct, sizeof(OBJ_SYNC_TRAP_ACT), nMaxCount, m_nMapX - POff[i].x, m_nMapY - POff[i].y);
  1273. }
  1274. }
  1275. int KObj::FindEnemy()
  1276. {
  1277. // (not end)
  1278. return 0;
  1279. }
  1280. int KObj::GetItemDataID()
  1281. {
  1282. return m_nItemDataID;
  1283. }
  1284. #endif
  1285. #ifdef _SERVER
  1286. void KObj::SetItemBelong(int nPlayerIdx)
  1287. {
  1288. m_nBelong = nPlayerIdx;
  1289. if (m_nBelong >= 0)
  1290. this->m_nBelongTime = OBJ_BELONG_TIME;
  1291. else
  1292. this->m_nBelongTime = 0;
  1293. }
  1294. #endif
  1295. #ifdef _SERVER
  1296. void KObj::SetEntireBelong(int nPlayerIdx)
  1297. {
  1298. m_nBelong = nPlayerIdx;
  1299. if (m_nBelong >= 0)
  1300. this->m_nBelongTime = this->m_nLifeTime * 2;
  1301. else
  1302. this->m_nBelongTime = 0;
  1303. }
  1304. #endif
  1305. void KObj::Remove(BOOL bSoundFlag)
  1306. {
  1307. #ifdef _SERVER
  1308. SyncRemove(bSoundFlag);
  1309. #else
  1310. if (bSoundFlag)
  1311. {
  1312. switch (m_nKind)
  1313. {
  1314. case Obj_Kind_Money:
  1315. PlaySound();
  1316. break;
  1317. case Obj_Kind_Box:
  1318. case Obj_Kind_Item:
  1319. case Obj_Kind_Door:
  1320. case Obj_Kind_Prop:
  1321. break;
  1322. }
  1323. }
  1324. m_Image.uImage = 0;
  1325. g_ScenePlace.RemoveObject(CGOG_OBJECT, m_nIndex, m_SceneID);
  1326. #endif
  1327. SubWorld[m_nSubWorldID].m_WorldMessage.Send(GWM_OBJ_DEL, m_nIndex);
  1328. }
  1329. int KObj::GetKind()
  1330. {
  1331. return m_nKind;
  1332. }
  1333. //-------------------------------------------------------------------------
  1334. // 功能: 凸多边形转换为障碍信息
  1335. //-------------------------------------------------------------------------
  1336. void KObj::PolygonChangeToBar(
  1337.  KPolygon Polygon, // 凸多边形
  1338.  int nGridWidth, // 格子长
  1339.  int nGridHeight, // 格子宽
  1340.  int nTableWidth, // 表格长
  1341.  int nTableHeight, // 表格宽
  1342.  BYTE *lpbBarTable) // 表格内容
  1343. {
  1344. if ( !lpbBarTable )
  1345. return;
  1346. if (nGridWidth <= 0 || nGridHeight <= 0 || nTableWidth <= 0 || nTableHeight <= 0)
  1347. return;
  1348. int nTemp, nTempLT, nTempRT, nTempLB, nTempRB, nFlag = 0;
  1349. POINT TempPos;
  1350. for (int i = 0; i < nTableWidth * nTableHeight; i++)
  1351. {
  1352. Polygon.GetCenterPos(&TempPos);
  1353. // 左上
  1354. TempPos.x += ((i % nTableWidth) * nGridWidth) - ((nTableWidth / 2) * nGridWidth + nGridWidth / 2);
  1355. TempPos.y += ((i / nTableWidth) * nGridHeight) - ((nTableHeight / 2) * nGridHeight + nGridHeight / 2);
  1356. nTempLT = Polygon.IsPointInPolygon(TempPos);
  1357. // 右上
  1358. TempPos.x += nGridWidth;
  1359. nTempRT = Polygon.IsPointInPolygon(TempPos);
  1360. // 左下
  1361. TempPos.x -= nGridWidth;
  1362. TempPos.y += nGridHeight;
  1363. nTempLB = Polygon.IsPointInPolygon(TempPos);
  1364. // 右下
  1365. TempPos.x += nGridWidth;
  1366. nTempRB = Polygon.IsPointInPolygon(TempPos);
  1367. nTemp = nTempLT + nTempRT + nTempLB + nTempRB;
  1368. if (nTemp == 0)
  1369. lpbBarTable[i] = Obj_Bar_Empty;
  1370. else if (nTemp > 1)
  1371. {
  1372. lpbBarTable[i] = Obj_Bar_Full;
  1373. nFlag = 1;
  1374. }
  1375. else
  1376. {
  1377. if (nTempLT)
  1378. lpbBarTable[i] = Obj_Bar_LT;
  1379. else if (nTempRT)
  1380. lpbBarTable[i] = Obj_Bar_RT;
  1381. else if (nTempLB)
  1382. lpbBarTable[i] = Obj_Bar_LB;
  1383. else if (nTempRB)
  1384. lpbBarTable[i] = Obj_Bar_RB;
  1385. }
  1386. }
  1387. lpbBarTable[(nTableHeight / 2) * nTableWidth + nTableWidth / 2] = Obj_Bar_Full;
  1388. }
  1389. #ifdef _SERVER
  1390. ServerImage::ServerImage()
  1391. {
  1392. Release();
  1393. }
  1394. void ServerImage::Release()
  1395. {
  1396. m_nTotalFrame = 1;
  1397. m_nCurFrame = 0;
  1398. m_nTotalDir = 1;
  1399. m_nCurDir = 0;
  1400. m_dwTimer = 0;
  1401. m_dwInterval = 0;
  1402. m_nDirFrames = 1;
  1403. }
  1404. //---------------------------------------------------------------------------
  1405. // 功能: 设定总帧数
  1406. //---------------------------------------------------------------------------
  1407. void ServerImage::SetTotalFrame(int nTotalFrame)
  1408. {
  1409. if (nTotalFrame > 0)
  1410. {
  1411. m_nTotalFrame = nTotalFrame;
  1412. m_nDirFrames = m_nTotalFrame / m_nTotalDir;
  1413. }
  1414. }
  1415. //---------------------------------------------------------------------------
  1416. // 功能: 设定当前帧
  1417. //---------------------------------------------------------------------------
  1418. void ServerImage::SetCurFrame(int nCurFrame)
  1419. {
  1420. if (nCurFrame < 0 || nCurFrame >= m_nTotalFrame)
  1421. return;
  1422. m_nCurFrame = nCurFrame;
  1423. if (m_nTotalFrame && m_nTotalDir)
  1424. m_nCurDir = nCurFrame / m_nDirFrames;
  1425. else
  1426. m_nCurDir = 0;
  1427. m_dwTimer = SubWorld[0].m_dwCurrentTime;
  1428. }
  1429. //---------------------------------------------------------------------------
  1430. // 功能: 设定总方向数
  1431. //---------------------------------------------------------------------------
  1432. void ServerImage::SetTotalDir(int nTotalDir)
  1433. {
  1434. if (nTotalDir > 0)
  1435. {
  1436. m_nTotalDir = nTotalDir;
  1437. m_nDirFrames = m_nTotalFrame / m_nTotalDir;
  1438. }
  1439. }
  1440. //---------------------------------------------------------------------------
  1441. // 功能: 设定当前方向
  1442. //---------------------------------------------------------------------------
  1443. BOOL ServerImage::SetCurDir(int nDir)
  1444. {
  1445. if (m_nCurDir == nDir)
  1446. return TRUE;
  1447. if (nDir < 0 || nDir >= m_nTotalDir)
  1448. return FALSE;
  1449. m_nCurDir = nDir;
  1450. m_nCurFrame = m_nDirFrames * nDir;
  1451. m_dwTimer = SubWorld[0].m_dwCurrentTime;
  1452. return FALSE;
  1453. }
  1454. //---------------------------------------------------------------------------
  1455. // 功能: 设定帧间隔
  1456. //---------------------------------------------------------------------------
  1457. void ServerImage::SetInterVal(DWORD dwInterval)
  1458. {
  1459. m_dwInterval = dwInterval;
  1460. }
  1461. //---------------------------------------------------------------------------
  1462. // 功能: 获得单方向帧数
  1463. //---------------------------------------------------------------------------
  1464. int ServerImage::GetOneDirFrames()
  1465. {
  1466. return m_nDirFrames;
  1467. }
  1468. //---------------------------------------------------------------------------
  1469. // 功能: 判断动画是否播放到最后,当前是第 0 帧
  1470. //---------------------------------------------------------------------------
  1471. BOOL ServerImage::CheckEnd()
  1472. {
  1473. if (m_nCurFrame == m_nDirFrames * (m_nCurDir + 1) - 1)
  1474. return TRUE;
  1475. return FALSE;
  1476. }
  1477. //---------------------------------------------------------------------------
  1478. // 功能: 设定当前方向的当前帧为第一帧
  1479. //---------------------------------------------------------------------------
  1480. void ServerImage::SetDirStart()
  1481. {
  1482. m_nCurFrame = m_nCurDir * m_nDirFrames;
  1483. }
  1484. //---------------------------------------------------------------------------
  1485. // 功能: 设定当前方向的当前帧为最后一帧
  1486. //---------------------------------------------------------------------------
  1487. void ServerImage::SetDirEnd()
  1488. {
  1489. m_nCurFrame = (m_nCurDir + 1) * m_nDirFrames - 1;
  1490. }
  1491. //---------------------------------------------------------------------------
  1492. // 功能: 取得当前方向的下一帧
  1493. //---------------------------------------------------------------------------
  1494. BOOL ServerImage::GetNextFrame(BOOL bLoop)
  1495. {
  1496. if (SubWorld[0].m_dwCurrentTime - m_dwTimer >= m_dwInterval)
  1497. {
  1498. m_dwTimer = SubWorld[0].m_dwCurrentTime;
  1499. m_nCurFrame++;
  1500. if (m_nCurFrame >= m_nDirFrames * (m_nCurDir + 1))
  1501. {
  1502. if (bLoop)
  1503. m_nCurFrame = m_nDirFrames * m_nCurDir;
  1504. else
  1505. m_nCurFrame = m_nDirFrames * (m_nCurDir + 1) - 1;
  1506. }
  1507. return TRUE;
  1508. }
  1509. return FALSE;
  1510. }
  1511. //---------------------------------------------------------------------------
  1512. // 功能: 取得当前方向的前一帧
  1513. //---------------------------------------------------------------------------
  1514. BOOL ServerImage::GetPrevFrame(BOOL bLoop)
  1515. {
  1516. if (SubWorld[0].m_dwCurrentTime - m_dwTimer >= m_dwInterval)
  1517. {
  1518. m_dwTimer = SubWorld[0].m_dwCurrentTime;
  1519. m_nCurFrame--;
  1520. if (m_nCurFrame < m_nDirFrames * m_nCurDir)
  1521. {
  1522. if (bLoop)
  1523. m_nCurFrame = m_nDirFrames * (m_nCurDir + 1) - 1;
  1524. else
  1525. m_nCurFrame = m_nDirFrames * m_nCurDir;
  1526. }
  1527. return TRUE;
  1528. }
  1529. return FALSE;
  1530. }
  1531. //---------------------------------------------------------------------------
  1532. // 功能: 设定当前方向(方向需从64方向转换到真正的方向)
  1533. //---------------------------------------------------------------------------
  1534. BOOL ServerImage::SetCurDir64(int nDir)
  1535. {
  1536. if (nDir < 0 || nDir >= 64)
  1537. return FALSE;
  1538. int nTempDir;
  1539. nTempDir = (nDir + (32 / m_nTotalDir)) / (64 / m_nTotalDir);
  1540. if (nTempDir >= m_nTotalDir)
  1541. nTempDir -= m_nTotalDir;
  1542. if (m_nCurDir == nTempDir)
  1543. return TRUE;
  1544. m_nCurDir = nTempDir;
  1545. m_nCurFrame = m_nDirFrames * nTempDir;
  1546. m_dwTimer = SubWorld[0].m_dwCurrentTime;
  1547. return FALSE;
  1548. }
  1549. //---------------------------------------------------------------------------
  1550. // 功能: 获得当前方向第几帧
  1551. //---------------------------------------------------------------------------
  1552. int ServerImage::GetCurDirFrameNo()
  1553. {
  1554. return m_nCurFrame - m_nCurDir * m_nDirFrames;
  1555. }
  1556. #endif
  1557. void KObj::GetMpsPos(int *pX, int *pY)
  1558. {
  1559. SubWorld[m_nSubWorldID].Map2Mps(m_nRegionIdx, m_nMapX, m_nMapY, m_nOffX, m_nOffY, pX, pY);
  1560. }
  1561. #ifndef _SERVER
  1562. void KObj::DrawBorder()
  1563. {
  1564. if (m_bDrawFlag)
  1565. return;
  1566. m_Image.bRenderStyle = IMAGE_RENDER_STYLE_BORDER;
  1567. switch(m_nKind)
  1568. {
  1569. case Obj_Kind_MapObj:
  1570. g_pRepresent->DrawPrimitives(1, &m_Image, RU_T_IMAGE, 0);
  1571. break;
  1572. case Obj_Kind_Prop:
  1573. if ( m_nState == OBJ_PROP_STATE_DISPLAY )
  1574. //m_cImage.DrawAlpha(x, y);
  1575. g_pRepresent->DrawPrimitives(1, &m_Image, RU_T_IMAGE, 0);
  1576. break;
  1577. default:
  1578. //m_cImage.DrawAlpha(x, y);
  1579. g_pRepresent->DrawPrimitives(1, &m_Image, RU_T_IMAGE, 0);
  1580. break;
  1581. }
  1582. m_Image.bRenderStyle = IMAGE_RENDER_STYLE_ALPHA;
  1583. }
  1584. #endif