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

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KObj.h
  5. // Date: 2002.01.06
  6. // Code: 边城浪子
  7. // Desc: Header File
  8. //---------------------------------------------------------------------------
  9. #ifndef KObj_H
  10. #define KObj_H
  11. #ifdef _SERVER
  12. #define MAX_OBJECT 20000
  13. #else
  14. #define MAX_OBJECT 256
  15. #endif
  16. #include "KPolygon.h"
  17. #ifndef _SERVER
  18. #include "KSprite.h"
  19. #include "KWavSound.h"
  20. #include "KSprControl.h"
  21. #endif
  22. #include "KIniFile.h"
  23. #include "GameDataDef.h"
  24. #ifndef _SERVER
  25. #include "../../Represent/iRepresent/KRepresentUnit.h"
  26. #endif
  27. #define OBJ_BAR_WIDTH 3 // 物件障碍 长
  28. #define OBJ_BAR_HEIGHT 5 // 物件障碍 宽
  29. #define OBJ_BAR_SIZE (OBJ_BAR_WIDTH*OBJ_BAR_HEIGHT) // 物件障碍 长x宽
  30. #define OBJ_BOX_STATE_CLOSE 0 // 宝箱状态 关
  31. #define OBJ_BOX_STATE_OPEN 1 // 宝箱状态 开
  32. #define OBJ_DOOR_STATE_CLOSE 0 // 门状态 关
  33. #define OBJ_DOOR_STATE_OPEN 1 // 门状态 开
  34. #define OBJ_PROP_STATE_DISPLAY 0 // 道具状态 关 不显示
  35. #define OBJ_PROP_STATE_HIDE 1 // 道具状态 开 显示
  36. #define OBJ_TRAP_STATE_STOP 0 // 陷阱状态 关
  37. #define OBJ_TRAP_STATE_ACTIVE 1 // 陷阱状态 开
  38. #define OBJ_TRAP_STATE_ACTING 2 // 陷阱状态 正在动作
  39. #define OBJ_BELONG_TIME 600
  40. enum Obj_Bar_Type // 物件地面格子障碍类型
  41. {
  42. Obj_Bar_Empty = 0, // 空,无障碍
  43. Obj_Bar_Full, // 完整障碍
  44. Obj_Bar_LT, // 左上区域为障碍
  45. Obj_Bar_RT, // 右上区域为障碍
  46. Obj_Bar_LB, // 左下区域为障碍
  47. Obj_Bar_RB, // 右下区域为障碍
  48. Obj_Bar_Type_Num, // 障碍类型数
  49. };
  50. typedef struct SOBJ_LIGHT_DATA
  51. {
  52. int m_nRadius; // 物件的光亮度
  53. int m_nRed; // 红偏色
  54. int m_nGreen; // 绿偏色
  55. int m_nBlue; // 蓝偏色
  56. int m_nAlpha; // alpha 值
  57. int m_nReflectType; // 受光方式(不受光、重心、水平、左斜、右斜)
  58. SOBJ_LIGHT_DATA() {Release();};
  59. void Release() { m_nRadius = 0; m_nRed = 0; m_nGreen = 0; m_nBlue = 0; m_nAlpha = 0; m_nReflectType = 0; };
  60. } OBJ_LIGHT; // 物件光线相关
  61. enum ObjTrap_Kind
  62. {
  63. ObjTrap_Kind_Cycle_Image_Static = 0,
  64. ObjTrap_Kind_Cycle_Image_Dir,
  65. ObjTrap_Kind_Auto_Image_Static,
  66. ObjTrap_Kind_Auto_Image_Dir,
  67. ObjTrap_Kind_Auto_Image_Target,
  68. ObjTrap_Kind_Auto_Delay_Static,
  69. ObjTrap_Kind_Auto_Delay_Dir,
  70. ObjTrap_Kind_Auto_Delay_Target,
  71. };
  72. typedef struct OBJ_SKILL_DATA
  73. {
  74. int m_nKind; // 地图陷阱类型
  75. int m_nCamp; // 此陷阱属于哪一方npc
  76. int m_nRange; // 陷阱触发范围
  77. int m_nCastTime; // 子弹发射时机
  78. int m_nID; // 技能类型
  79. int m_nLevel; // 技能等级
  80. int m_nTarX; // 目标坐标 x
  81. int m_nTarY; // 目标坐标 y
  82. OBJ_SKILL_DATA() {Release();};
  83. void Release() {m_nKind = 0; m_nCamp = camp_animal; m_nRange = 0; m_nCastTime = 0; m_nID = 0; m_nLevel = 0; m_nTarX = 0; m_nTarY = 0;};
  84. } OBJ_SKILL; // 地图陷阱相关(发射技能)
  85. //---------------------------------------------------------------------------
  86. #ifdef _SERVER
  87. class ServerImage
  88. {
  89. public:
  90. int m_nTotalFrame; // 总帧数
  91. int m_nCurFrame; // 当前帧
  92. int m_nTotalDir; // 总方向数
  93. int m_nCurDir; // 当前方向
  94. DWORD m_dwTimer; // 时间计数器
  95. DWORD m_dwInterval; // 帧间隔(动画速度)
  96. protected:
  97. int m_nDirFrames; // 每方向帧数
  98. public:
  99. ServerImage(); // 构造函数
  100. void Release(); // 清空
  101. void SetTotalFrame(int nTotalFrame); // 设定总帧数
  102. void SetCurFrame(int nCurFrame); // 设定当前帧
  103. void SetTotalDir(int nTotalDir); // 设定总方向数
  104. BOOL SetCurDir(int nDir); // 设定当前方向
  105. void SetInterVal(DWORD dwInterval); // 设定帧间隔
  106. int GetOneDirFrames(); // 获得单方向帧数
  107. BOOL GetNextFrame(BOOL bLoop = TRUE); // 自动向后换帧
  108. BOOL GetPrevFrame(BOOL bLoop = TRUE); // 自动向前换帧
  109. BOOL CheckEnd(); // 判断动画是否播放到最后
  110. void SetDirStart(); // 设定当前方向的当前帧为第一帧
  111. void SetDirEnd(); // 设定当前方向的当前帧为最后一帧
  112. BOOL SetCurDir64(int nDir); // 设定当前方向(方向需从64方向转换到真正的方向)
  113. int GetCurDirFrameNo();
  114. };
  115. #endif
  116. #ifdef TOOLVERSION
  117. class CORE_API KObj
  118. #else
  119. class KObj
  120. #endif
  121. {
  122. friend class KObjSet;
  123. public:
  124. int m_nID; // 物件的世界唯一ID,客户端与服务器端一一对应,如果值为 0 ,此为客户端 obj ,服务器端没有对应的 obj
  125. int m_nDataID; // 此物件在物件数据表中的位置(就是在模板中的编号)
  126. int m_nKind; // 类型 对应 Obj_Kind_XXXX
  127. int m_nIndex; // 在 Object 数组中的位置
  128. int m_nBelongRegion; // 本物体属于哪个region,不是坐标,坐标可以变动,这个是随产生时那个region,客户端存储的是 region id
  129. int m_nSubWorldID; // 子世界ID
  130. int m_nRegionIdx; // 区域idx
  131. int m_nMapX; // 地图格子坐标 x
  132. int m_nMapY; // 地图格子坐标 y
  133. int m_nOffX; // 地图格子中的偏移 x (注:其值为像素点值 * 1024)
  134. int m_nOffY; // 地图格子中的偏移 y (注:其值为像素点值 * 1024)
  135. int m_nDir; // 方向,此方向为物件的逻辑方向,按64方向计算,不是具体的图像方向
  136. int m_nState; // 状态
  137. int m_nLifeTime; // 物件的消失时间(主要用于尸体类、装备类、宝箱类等)
  138. int m_nBornTime; // 重生倒计时(box打开状态经过lifetime自动关闭,prop隐身状态经过lifetime自动显示)
  139. int m_nWaitTime; // 等待时间(用于obj trap,暂时无用)
  140. OBJ_SKILL m_cSkill; // 物件所带魔法技能(用于obj trap,暂时无用)
  141. char m_szName[32]; // 物件名称
  142. // char m_szScriptName[80]; // 所带脚本文件名
  143. DWORD m_dwScriptID; // 所带脚本文件ID
  144. int m_nColorID; // 物件名字显示时的颜色id,客户端通过查表找到相应颜色
  145. int m_nItemDataID; // 用于物品,指明物品的具体数据
  146. int m_nItemWidth; // 物品长(放置在容器中的时候)
  147. int m_nItemHeight; // 物品宽(放置在容器中的时候)
  148. int m_nMoneyNum; // 如果是掉在地上的钱,钱的数量
  149. #ifdef _SERVER
  150. // 如果是打怪物掉出来的装备或钱:谁打出来的(记录的是player index) if == -1 不从属于任何人,任何人都能捡
  151. int m_nBelong;
  152. // m_nBelong 起作用的时间(是个倒计时)
  153. int m_nBelongTime;
  154. ServerImage m_cImage; // 服务器端图像控制
  155. #endif
  156. #ifndef _SERVER
  157. char m_szImageName[80]; // 图像文件名
  158. char m_szSoundName[80]; // 声音文件名
  159. KSprControl m_cImage; // 物件图像
  160. char m_szImageDropName[80]; // 如果是item类型,掉出来的时候播放的动画文件名
  161. KSprControl m_cImageDrop; // 如果是item类型,掉出来的时候播放的动画的图像控制
  162. int m_nDropState; // 如果是item类型,当前是掉出动画状态(1)还是放置在地板上状态(0)
  163. KRUImage m_Image;
  164. unsigned int m_SceneID;
  165. int m_nLayer; // 物件位于第几层
  166. int m_nHeight; // 物件的逻辑高度
  167. OBJ_LIGHT m_sObjLight; // 物件与亮度、发光相关的数据
  168. DWORD m_dwNameColor; // 物件名字的颜色
  169. #endif
  170. KPolygon Polygon; // 底面多边形
  171. BYTE m_btBar[OBJ_BAR_SIZE]; // 物件底面障碍信息
  172. private:
  173. DWORD m_dwTimer; // 时间计数器(用于声音播放)
  174. #ifndef _SERVER
  175. KCacheNode* m_pSoundNode; // 声效指针
  176. KWavSound* m_pWave; // 声效wav指针
  177. BOOL m_bDrawFlag; // 绘制是否特殊处理(FALSE 绘制   TRUE 不绘制)
  178. #endif
  179. public:
  180. KObj();
  181. void GetMpsPos(int *pX, int *pY);
  182. void Release();
  183. void Activate();
  184. // void Save(KIniFile *IniFile, LPSTR Section);
  185. // void Load(int nObjIndex, int nSubWorldID, KIniFile *IniFile, LPSTR Section);
  186. void ExecScript(int nPlayerIdx);
  187. void CastSkill(int nDir);
  188. void CastSkill(int nXpos, int nYpos);
  189. void SetIndex(int nIndex);
  190. void SetWorldID(int nID); // 物件的世界唯一 ID
  191. void SetLifeTime(int nLifeTime);
  192. BOOL SetDir(int n64Dir);
  193. void SetState(int nState, int nPlaySoundFlag = 0);
  194. void SetImageDir(int nDir);
  195. void Remove(BOOL bSoundFlag);
  196. void SetScriptFile(char *lpszScriptFile);
  197. int GetKind();
  198. #ifdef _SERVER
  199. int FindEnemy();
  200. void TrapAct();
  201. void SetItemDataID(int nItemDataID);
  202. BOOL SyncAdd(int nClient);
  203. void SyncState();
  204. void SyncDir();
  205. void SyncRemove(BOOL bSoundFlag);
  206. int GetItemDataID();
  207. void SetItemBelong(int nPlayerIdx);
  208. void SetEntireBelong(int nPlayerIdx);
  209. #endif
  210. #ifndef _SERVER
  211. void Draw();
  212. void DrawInfo();
  213. void DrawBorder();
  214. #endif
  215. // 凸多边形转换为障碍信息
  216. void PolygonChangeToBar(
  217. KPolygon Polygon, // 凸多边形
  218. int nGridWidth, // 格子长
  219. int nGridHeight, // 格子宽
  220. int nTableWidth, // 表格长
  221. int nTableHeight, // 表格宽
  222. BYTE *lpbBarTable); // 表格内容
  223. private:
  224. void BoxOpen();
  225. void BoxClose();
  226. void DoorOpen();
  227. void DoorClose();
  228. #ifndef _SERVER
  229. void PlayLoopSound();
  230. void PlayRandSound();
  231. int GetSoundPan();
  232. int GetSoundVolume();
  233. void PlaySound();
  234. #endif
  235. };
  236. extern KObj Object[MAX_OBJECT];
  237. //---------------------------------------------------------------------------
  238. #endif
  239. /*
  240. 地图动画:保存在地图文件的 obj 部分中,服务器不进行处理,其障碍信息预先存储
  241.           在地图的 obj 障碍信息层里面。在客户端,根据其坐标、spr 文件名进行
  242.   换帧处理,换帧处理的根据(帧数、方向等信息)存储于 obj 的 ini 文件
  243.   中以便动态加载。
  244. 循环音效、随机音效:保存在地图文件的 obj 部分中,服务器不进行处理,无障碍信
  245.                     息,无图像信息。在客户端,根据其坐标与玩家的位置播放声音。
  246. npc 的尸体:只存在于客户端,服务器端不进行处理,障碍信息为空。在客户端,根据
  247.             其坐标、方向、生命帧、spr 文件名进行处理。
  248. */
  249. /*
  250. 地图陷阱状态:活动、静止
  251. 地图陷阱触发方式:(状态改变方式)
  252. 1、不自动(脚本驱动),当处于活动状态时,根据图像循环在图像位置发射静止子弹
  253.    或朝固定方向发射飞行子弹
  254. 2、自动,脚本可以控制此陷阱是否起作用,当起作用时,自动检测是否有目标npc在作
  255.    用范围内,如果有,则发射子弹,子弹的发射方式有两种:按图像循环在固定帧发
  256.    射和按一定的时间间隔发射。发射方向还可分为在图像位置发射静止子弹、朝固定
  257.    方向发射飞行子弹、朝目标npc发射子弹
  258. 由以上的分类,地图陷阱的类型分为以下几类:
  259. 1  ObjTrap_Kind_Cycle_Image_Static
  260. 2  ObjTrap_Kind_Cycle_Image_Dir
  261. 3  ObjTrap_Kind_Auto_Image_Static
  262. 4  ObjTrap_Kind_Auto_Image_Dir
  263. 5  ObjTrap_Kind_Auto_Image_Target
  264. 6  ObjTrap_Kind_Auto_Delay_Static
  265. 7  ObjTrap_Kind_Auto_Delay_Dir
  266. 8  ObjTrap_Kind_Auto_Delay_Target
  267. */