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

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KObjSet.h
  5. // Date: 2002.01.06
  6. // Code: 边城浪子
  7. // Desc: Obj Class
  8. //---------------------------------------------------------------------------
  9. #ifndef KObjSetH
  10. #define KObjSetH
  11. #include "KObj.h"
  12. #include "KLinkArray.h"
  13. #define MAX_OBJ_NAME_COLOR 16
  14. typedef struct
  15. {
  16. char m_szCopyRight[31];
  17. BYTE m_btVersion;
  18. DWORD m_dwNum;
  19. } KObjMapDataHead;
  20. typedef struct
  21. {
  22. int m_nTemplateID;
  23. int m_nState;
  24. int m_nDir;
  25. int m_nPos[3];
  26. DWORD m_dwScriptLength;
  27. char m_szScript[80];
  28. } KObjMapData;
  29. typedef struct
  30. {
  31. int m_nItemID;
  32. int m_nMoneyNum;
  33. int m_nItemWidth;
  34. int m_nItemHeight;
  35. int m_nColorID;
  36. int m_nMovieFlag;
  37. int m_nSoundFlag;
  38. char m_szName[FILE_NAME_LENGTH];
  39. } KObjItemInfo;
  40. class KObjSet
  41. {
  42. public:
  43. KTabFile m_cTabFile;
  44. KTabFile m_cMoneyFile;
  45. int m_nObjID;
  46. #ifndef _SERVER
  47. DWORD m_dwNameColor[MAX_OBJ_NAME_COLOR];
  48. int m_nShowNameFlag; // 是否全部显示 item 和 money 类的 object 的名字在头顶上
  49. #endif
  50. private:
  51. KLinkArray m_UseIdx;
  52. KLinkArray m_FreeIdx;
  53. public:
  54. KObjSet();
  55. ~KObjSet();
  56. BOOL Init();
  57. int GetID();
  58. void Remove(int nIdx);
  59. #ifdef _SERVER
  60. // 添加一个obj,返回在obj数组中的位置编号(如果 < 0 ,失败)
  61. int Add(int nDataID, KMapPos MapPos, KObjItemInfo sItemInfo);
  62. // 从obj数据文件中载入相应数据
  63. int AddData(int nDataID, KMapPos MapPos, int nMoneyNum = 0, int nItemID = 0, int nItemWidth = 0, int nItemHeight = 0);
  64. int AddMoneyObj(KMapPos MapPos, int nMoneyNum);
  65. // 服务器端载入一个Region的所有Obj
  66. BOOL ServerLoadRegionObj(char *lpszMapPath, int nRegionX, int nRegionY, int nSubWorld);
  67. // 服务器端载入一个Region的所有Obj
  68. BOOL ServerLoadRegionObj(int nSubWorld, KPakFile *pFile, DWORD dwDataSize);
  69. // 设定obj所带的物件信息,包括物件id,物件在装备栏中的长、宽
  70. BOOL SetObjItem(int nObjIndex, int nItemID, int nItemWidth, int nItemHeight);
  71. BOOL SyncAdd(int nID, int nClient);
  72. #endif
  73. #ifndef _SERVER
  74. int AddData(int nDataID, int nSubWorld, int nRegion, int nMapX, int nMapY, int nOffX, int nOffY);
  75. int ClientAdd(int nID, int nDataID, int nState, int nDir, int nCurFrame, int nXpos, int nYpos, KObjItemInfo sInfo);
  76. BOOL ClientLoadRegionObj(char *lpszMapPath, int nRegionX, int nRegionY, int nSubWorld, int nRegion);
  77. BOOL ClientLoadRegionObj(KPakFile *pFile, DWORD dwDataSize);
  78. void RemoveIfClientOnly(int nIdx);
  79. int SearchObjAt(int nX, int nY, int nRange);
  80. DWORD GetNameColor(int nColorID);
  81. void SetShowNameFlag(BOOL bFlag);
  82. BOOL CheckShowName();
  83. #endif
  84. int FindID(int nID);
  85. int FindName(char *lpszObjName);
  86. private:
  87. int FindFree();
  88. int CheckClientKind(int nKind);
  89. int GetDataIDKind(int nDataID);
  90. #ifdef _SERVER
  91. int GetMoneyDataId(int nMoney);
  92. #endif
  93. };
  94. extern KObjSet ObjSet;
  95. extern char g_szObjKind[Obj_Kind_Num][32];
  96. #endif
  97. /*
  98. 当服务器接收到需要产生一个新的物件的要求后,例如在地板上放置一件装备,为了确定
  99. 这件装备,需要一些信息:
  100.     1、位置信息:这是最基本的必需的信息
  101.     2、基本数据的信息(DataID),这些信息包括:物件的名称、类型、障碍信息等同一
  102.        种DataID共通的信息,这些信息存放在 ObjData.txt 文件里面,通过读取这些信
  103.        息可以初步确定出这个物件
  104.     3、具体的每个实例之间不同的信息,比如:当前的状态、当前的方向(有些类型的物
  105.        件可能需要处理方向信息)、当前的生命时间(有些类型的物件有生命时间及相应
  106.        的处理)、当前所带脚本文件名称、当前的装备数据ID(装备类)、服务器端用于
  107.        动画控制的各种信息(地图机关类等)、当前障碍信息(门类可能有打开、关闭状
  108.        态等)
  109. 当确定有足够的信息后,可以调用具体的方法在服务器端生成一个新的物件,具体到使用
  110. 上,首先调用 AddData() 方法,把第 1 、第 2 项信息传入,这个方法会自动从 Object
  111. 数组中寻找一个空项,加载入相应的基本数据,产生一个新的物件,返回新物件在数组中
  112. 的位置xxx;然后给新物件安一个世界唯一ID,通知客户端产生一个对应的新物件;然后就
  113. 可以通知相应SubWorld的相应Region开始管理这个新物件:
  114.     SubWorld[nSubWorld].m_WorldMessage.Send(GWM_OBJ_ADD, nRegion, xxx);
  115. 然后设定此物件的一些个体信息,即设定第 3 项信息,可能需要调用的方法有:
  116.     Object[xxx].SetLifeTime()
  117.     Object[xxx].SetState()
  118.     Object[xxx].SetDir()
  119.     Object[xxx].SetItemDataID()
  120.     Object[xxx].SetScriptFile() 等;
  121. 至此,一个新的物件在服务器端已经产生好了;
  122. 而客户端当接收到服务器端的产生新物件的命令后,调用 ClientAdd() 方法在客户端产生
  123. 一个对应的新物件,具体产生方法为:首先自动从 Object 数组中寻找一个空项,加载入
  124. 相应的基本数据,产生一个新的物件,返回新物件在数组中的位置xxx;把接收到的世界唯
  125. 一 ID 给它安上,然后设定各种接收到的参数,最后通知相应SubWorld的相应Region开始
  126. 管理这个新物件;至此,新物件已经产生出来了,但是它的各项参数还没有最终设定完成,
  127. 需要以后服务器端发过来的同步信息才能最终得到正确的表现。
  128. */