areadamagemanager.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. class AreaDamageComponentTypes
  2. {
  3. const int BASE = 0;
  4. const int HITZONE = 1;
  5. const int RAYCASTED = 2;
  6. }
  7. class AreaDamageManager : AreaDamageEvents
  8. {
  9. protected EntityAI m_ParentObject;
  10. protected AreaDamageTriggerBase m_AreaDamageTrigger;
  11. protected ref AreaDamageComponent m_DamageComponent;
  12. protected vector m_ExtentMin;
  13. protected vector m_ExtentMax;
  14. protected vector m_AreaPosition;
  15. protected vector m_AreaOrientation;
  16. protected string m_TriggerBaseClass;
  17. void AreaDamageManager(EntityAI parent)
  18. {
  19. m_ParentObject = parent;
  20. m_DamageComponent = new AreaDamageComponent(this);
  21. m_ExtentMin = vector.Zero;
  22. m_ExtentMax = vector.Zero;
  23. m_AreaPosition = parent.GetPosition();
  24. m_AreaOrientation = parent.GetOrientation();
  25. m_TriggerBaseClass = "AreaDamageTriggerBase";
  26. }
  27. void ~AreaDamageManager()
  28. {
  29. Destroy();
  30. }
  31. void SetDamageComponentType(int type)
  32. {
  33. switch (type)
  34. {
  35. case AreaDamageComponentTypes.BASE:
  36. {
  37. m_DamageComponent = new AreaDamageComponent(this);
  38. break;
  39. }
  40. case AreaDamageComponentTypes.HITZONE:
  41. {
  42. m_DamageComponent = new AreaDamageComponentRandomHitzone(this);
  43. break;
  44. }
  45. case AreaDamageComponentTypes.RAYCASTED:
  46. {
  47. m_DamageComponent = new AreaDamageComponentRaycasted(this);
  48. break;
  49. }
  50. default:
  51. {
  52. Error(string.Format("[ERROR] :: [AreaDamageManager] :: Unknown DamageComponentType: %1", type));
  53. break;
  54. }
  55. }
  56. }
  57. //! spawn damage trigger
  58. void Spawn()
  59. {
  60. if ( CreateDamageTriggerEx() )
  61. OnTriggerCreated();
  62. }
  63. //! destroy damage trigger
  64. void Destroy()
  65. {
  66. if ( DestroyDamageTriggerEx() )
  67. OnTriggerDestroyed();
  68. }
  69. /////////////////////////////////////////////////////////////
  70. /** @name AreaDamageEvents Implementation
  71. * Implementation for handling \ref AreaDamageEvents
  72. * Pass them on to the AreaDamageComponent
  73. * Calling of the events that are the same in TriggerEvents will come from AreaDamageTriggerBase
  74. */
  75. ///@{
  76. //! Called when a trigger is created
  77. override void OnTriggerCreated()
  78. {
  79. m_DamageComponent.OnTriggerCreated();
  80. }
  81. //! Called when a trigger is destroyed
  82. override void OnTriggerDestroyed()
  83. {
  84. m_DamageComponent.OnTriggerDestroyed();
  85. }
  86. //! Called when an object enters the trigger
  87. override void OnEnterBeginEvent(TriggerInsider insider)
  88. {
  89. m_DamageComponent.OnEnterBeginEvent(insider);
  90. }
  91. override void OnEnterServerEvent(TriggerInsider insider)
  92. {
  93. m_DamageComponent.OnEnterServerEvent(insider);
  94. }
  95. override void OnEnterClientEvent(TriggerInsider insider)
  96. {
  97. m_DamageComponent.OnEnterClientEvent(insider);
  98. }
  99. override void OnEnterEndEvent(TriggerInsider insider)
  100. {
  101. m_DamageComponent.OnEnterEndEvent(insider);
  102. }
  103. //! Called at the beginning of an update loop
  104. override void OnStayStartBeginEvent(int nrOfInsiders)
  105. {
  106. m_DamageComponent.OnStayStartBeginEvent(nrOfInsiders);
  107. }
  108. override void OnStayStartServerEvent(int nrOfInsiders)
  109. {
  110. m_DamageComponent.OnStayStartServerEvent(nrOfInsiders);
  111. }
  112. override void OnStayStartClientEvent(int nrOfInsiders)
  113. {
  114. m_DamageComponent.OnStayStartClientEvent(nrOfInsiders);
  115. }
  116. override void OnStayStartEndEvent(int nrOfInsiders)
  117. {
  118. m_DamageComponent.OnStayStartEndEvent(nrOfInsiders);
  119. }
  120. //! Called in the update loop
  121. override void OnStayBeginEvent(TriggerInsider insider, float deltaTime)
  122. {
  123. m_DamageComponent.OnStayBeginEvent(insider, deltaTime);
  124. }
  125. override void OnStayServerEvent(TriggerInsider insider, float deltaTime)
  126. {
  127. m_DamageComponent.OnStayServerEvent(insider, deltaTime);
  128. }
  129. override void OnStayClientEvent(TriggerInsider insider, float deltaTime)
  130. {
  131. m_DamageComponent.OnStayClientEvent(insider, deltaTime);
  132. }
  133. override void OnStayEndEvent(TriggerInsider insider, float deltaTime)
  134. {
  135. m_DamageComponent.OnStayEndEvent(insider, deltaTime);
  136. }
  137. //! Called at the end of an update loop
  138. override void OnStayFinishBeginEvent()
  139. {
  140. m_DamageComponent.OnStayFinishBeginEvent();
  141. }
  142. override void OnStayFinishServerEvent()
  143. {
  144. m_DamageComponent.OnStayFinishServerEvent();
  145. }
  146. override void OnStayFinishClientEvent()
  147. {
  148. m_DamageComponent.OnStayFinishClientEvent();
  149. }
  150. override void OnStayFinishEndEvent()
  151. {
  152. m_DamageComponent.OnStayFinishEndEvent();
  153. }
  154. //! Called when an object leaves the trigger
  155. override void OnLeaveBeginEvent(TriggerInsider insider)
  156. {
  157. m_DamageComponent.OnLeaveBeginEvent(insider);
  158. }
  159. override void OnLeaveServerEvent(TriggerInsider insider)
  160. {
  161. m_DamageComponent.OnLeaveServerEvent(insider);
  162. }
  163. override void OnLeaveClientEvent(TriggerInsider insider)
  164. {
  165. m_DamageComponent.OnLeaveClientEvent(insider);
  166. }
  167. override void OnLeaveEndEvent(TriggerInsider insider)
  168. {
  169. m_DamageComponent.OnLeaveEndEvent(insider);
  170. }
  171. //! Tell the AreaDamageComponent to calculate and apply the damage to the Object
  172. override bool OnEvaluateDamage(TriggerInsider insider, float damageCoef)
  173. {
  174. return m_DamageComponent.OnEvaluateDamage(insider, damageCoef);
  175. }
  176. //! Usually called from AreaDamageComponent
  177. override void PreDamageActions()
  178. {
  179. if ( m_ParentObject )
  180. m_ParentObject.PreAreaDamageActions();
  181. }
  182. //! Usually called from AreaDamageComponent
  183. override void PostDamageActions()
  184. {
  185. if ( m_ParentObject )
  186. m_ParentObject.PostAreaDamageActions();
  187. }
  188. ///@}
  189. /////////////////////////////////////////////////////////////
  190. //! Some event extensions
  191. ///@{
  192. //! Alternative OnEvaluateDamage, using CalculateDamageScale
  193. bool OnEvaluateDamageEx(TriggerInsider insider, float deltaTime)
  194. {
  195. return OnEvaluateDamage( insider, CalculateDamageScale( insider, deltaTime ) );
  196. }
  197. //! Helper for calculating damageCoeff when using OnEvaluateDamageEx
  198. protected float CalculateDamageScale(TriggerInsider insider, float deltaTime)
  199. {
  200. return deltaTime;
  201. }
  202. ///@}
  203. //! script configuration
  204. ///@{
  205. void SetExtents( vector mins, vector maxs )
  206. {
  207. m_ExtentMin = mins;
  208. m_ExtentMax = maxs;
  209. if ( m_AreaDamageTrigger )
  210. {
  211. m_AreaDamageTrigger.SetExtents(m_ExtentMin, m_ExtentMax);
  212. }
  213. }
  214. void GetExtents( out vector mins, out vector maxs )
  215. {
  216. mins = m_ExtentMin;
  217. maxs = m_ExtentMax;
  218. }
  219. void GetWorldExtents( out vector mins, out vector maxs )
  220. {
  221. GetExtents(mins, maxs);
  222. mins + m_AreaPosition;
  223. maxs + m_AreaPosition;
  224. }
  225. void SetAmmoName( string ammo_name )
  226. {
  227. m_DamageComponent.m_AmmoName = ammo_name;
  228. }
  229. string GetAmmoName()
  230. {
  231. return m_DamageComponent.m_AmmoName;
  232. }
  233. void SetDamageType( int pDamageType )
  234. {
  235. m_DamageComponent.m_DamageType = pDamageType;
  236. }
  237. int GetDamageType()
  238. {
  239. return m_DamageComponent.m_DamageType;
  240. }
  241. void SetParentObject( EntityAI obj )
  242. {
  243. m_ParentObject = obj;
  244. }
  245. EntityAI GetParentObject()
  246. {
  247. return m_ParentObject;
  248. }
  249. void SetAreaPosition( vector position )
  250. {
  251. m_AreaPosition = position;
  252. if ( m_AreaDamageTrigger )
  253. {
  254. m_AreaDamageTrigger.SetPosition(m_AreaPosition);
  255. }
  256. }
  257. vector GetPosition()
  258. {
  259. return m_AreaPosition;
  260. }
  261. void SetAreaOrientation( vector orientation )
  262. {
  263. m_AreaOrientation = orientation;
  264. if ( m_AreaDamageTrigger )
  265. {
  266. m_AreaDamageTrigger.SetOrientation(m_AreaOrientation);
  267. }
  268. }
  269. vector GetOrientation()
  270. {
  271. return m_AreaOrientation;
  272. }
  273. void SetDamageableTypes(array<typename> damageableTypes)
  274. {
  275. m_DamageComponent.m_DamageableTypes = damageableTypes;
  276. }
  277. array<typename> GetDamageableTypes()
  278. {
  279. return m_DamageComponent.m_DamageableTypes;
  280. }
  281. void AddDamageableType(typename damageableType)
  282. {
  283. if (m_DamageComponent.m_DamageableTypes.Find(damageableType) != -1)
  284. m_DamageComponent.m_DamageableTypes.Insert(damageableType);
  285. }
  286. void RemoveAddDamageableType(typename damageableType)
  287. {
  288. m_DamageComponent.m_DamageableTypes.RemoveItem(damageableType);
  289. }
  290. void SetLoopInterval( float time )
  291. {
  292. Error("SetLoopInterval not implemented - usable in Regular(looped) area damage objects only");
  293. }
  294. void SetDeferDuration( float time )
  295. {
  296. Error("SetDeferDuration not implemented - usable in Deferred area damage objects only");
  297. }
  298. void SetHitZones( array<string> hitzones )
  299. {
  300. AreaDamageComponentRandomHitzone adc;
  301. if ( CastTo( adc, m_DamageComponent ) )
  302. adc.SetHitZones( hitzones );
  303. else
  304. Error("SetHitZones not implemented - override for non raycasted versions of area damage objects only");
  305. }
  306. void SetRaycastSources( array<string> raycast_sources )
  307. {
  308. AreaDamageComponentRaycasted adc;
  309. if ( CastTo( adc, m_DamageComponent ) )
  310. adc.SetRaycastSources( raycast_sources );
  311. else
  312. Error("SetRaycastSources not implemented - override for raycasted versions of area damage objects only");
  313. }
  314. void SetRaycastSourcesVector( array<vector> raycast_sources )
  315. {
  316. AreaDamageComponentRaycasted adc;
  317. if ( CastTo( adc, m_DamageComponent ) )
  318. adc.SetRaycastSourcesVector( raycast_sources );
  319. else
  320. Error("SetRaycastSources not implemented - override for raycasted versions of area damage objects only");
  321. }
  322. AreaDamageTriggerBase GetTrigger()
  323. {
  324. return m_AreaDamageTrigger;
  325. }
  326. ///@}
  327. //! create damage trigger with basic set of params
  328. ///@{
  329. protected bool CreateDamageTriggerEx()
  330. {
  331. int flags;
  332. if ( GetGame().IsMultiplayer() && GetGame().IsServer() )
  333. flags = ECE_CREATEPHYSICS;
  334. else
  335. flags = ECE_LOCAL;
  336. if (Class.CastTo(m_AreaDamageTrigger, GetGame().CreateObjectEx( m_TriggerBaseClass, m_AreaPosition, flags )))
  337. {
  338. m_AreaDamageTrigger.SetOrientation( m_AreaOrientation );
  339. m_AreaDamageTrigger.SetExtents( m_ExtentMin, m_ExtentMax );
  340. m_AreaDamageTrigger.SetAreaDamageManager(this);
  341. return true;
  342. }
  343. return false;
  344. }
  345. protected void CreateDamageTrigger()
  346. {
  347. CreateDamageTriggerEx();
  348. }
  349. ///@}
  350. //! destroys damage trigger
  351. ///@{
  352. protected bool DestroyDamageTriggerEx()
  353. {
  354. if ( GetGame() && m_AreaDamageTrigger ) // It's necesarry to check if the game exists. Otherwise a crash occurs while quitting.
  355. {
  356. GetGame().ObjectDelete( m_AreaDamageTrigger );
  357. m_AreaDamageTrigger = null;
  358. return true;
  359. }
  360. return false;
  361. }
  362. protected void DestroyDamageTrigger()
  363. {
  364. DestroyDamageTriggerEx();
  365. }
  366. ///@}
  367. }