events.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. /**@enum WeaponEventID
  2. * @brief identifier for events.
  3. * mainly for rpc purposes
  4. **/
  5. enum WeaponEventID
  6. {
  7. UNKNOWN,
  8. MECHANISM,
  9. TRIGGER,
  10. TRIGGER_JAM,
  11. TRIGGER_AUTO_START,
  12. TRIGGER_AUTO_END,
  13. LOAD1_BULLET,
  14. CONTINUOUS_LOADBULLET_START,
  15. CONTINUOUS_LOADBULLET_END,
  16. UNJAM,
  17. ATTACH_MAGAZINE,
  18. UNJAMMING_FAILED_TIMEOUT,
  19. UNJAMMING_TIMEOUT,
  20. DETACH_MAGAZINE,
  21. SWAP_MAGAZINE,
  22. HUMANCOMMAND_ACTION_FINISHED,
  23. HUMANCOMMAND_ACTION_ABORTED,
  24. RELOAD_TIMEOUT,
  25. DRY_FIRE_TIMEOUT,
  26. SET_NEXT_MUZZLE_MODE,
  27. ANIMATION_EVENT,
  28. };
  29. /**@class WeaponEventBase
  30. * @brief represents event that triggers transition from state to state
  31. **/
  32. class WeaponEventBase
  33. {
  34. int m_eventID;
  35. DayZPlayer m_player;
  36. Magazine m_magazine;
  37. void WeaponEventBase (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = 0; m_player = p; m_magazine = m; }
  38. /// returns id from enum WeaponEventID
  39. WeaponEventID GetEventID () { return m_eventID; }
  40. /// returns animation event from anim engine, @see WeaponEvents
  41. WeaponEvents GetAnimEvent () { return -1; }
  42. /// returns eventID in upper 16 bits and AnimEvent in lower 16 bits
  43. int GetPackedType ()
  44. {
  45. int animEvent = GetAnimEvent() & 0x0000ffff;
  46. int evShl = m_eventID << 16;
  47. return evShl | animEvent;
  48. }
  49. void ReadFromContext (ParamsReadContext ctx) { }
  50. void WriteToContext (ParamsWriteContext ctx)
  51. {
  52. int packedType = GetPackedType();
  53. ctx.Write(packedType);
  54. ctx.Write(m_player);
  55. ctx.Write(m_magazine);
  56. }
  57. string DumpToString ()
  58. {
  59. string res = "{ WpnEv id=" + typename.EnumToString(WeaponEventID, GetEventID());
  60. res = res + " pl=" + Object.GetDebugName(m_player);
  61. res = res + " mag=" + Object.GetDebugName(m_magazine);
  62. res = res + " }";
  63. return res;
  64. }
  65. };
  66. /**@brief signalize mechanism manipulation
  67. **/
  68. class WeaponEventMechanism extends WeaponEventBase
  69. {
  70. void WeaponEventMechanism (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.MECHANISM; }
  71. };
  72. /**@brief event when trigger pressed
  73. **/
  74. class WeaponEventTrigger extends WeaponEventBase
  75. {
  76. void WeaponEventTrigger (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.TRIGGER; }
  77. };
  78. /**@brief event when trigger pressed
  79. **/
  80. class WeaponEventTriggerToJam extends WeaponEventBase
  81. {
  82. void WeaponEventTriggerToJam (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.TRIGGER_JAM; }
  83. };
  84. /**@brief event when trigger pressed
  85. **/
  86. class WeaponEventTriggerAutoStart extends WeaponEventBase
  87. {
  88. void WeaponEventTriggerAutoStart (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.TRIGGER_AUTO_START; }
  89. };
  90. /**@brief event when trigger pressed
  91. **/
  92. class WeaponEventTriggerAutoEnd extends WeaponEventBase
  93. {
  94. void WeaponEventTriggerAutoEnd (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.TRIGGER_AUTO_END; }
  95. };
  96. /**@brief event when user wants to load 1 bullet
  97. **/
  98. class WeaponEventLoad1Bullet extends WeaponEventBase
  99. {
  100. void WeaponEventLoad1Bullet (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.LOAD1_BULLET; }
  101. };
  102. /**@brief event when user wants to load N bullets
  103. **/
  104. class WeaponEventContinuousLoadBulletStart extends WeaponEventBase
  105. {
  106. void WeaponEventContinuousLoadBulletStart (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.CONTINUOUS_LOADBULLET_START; }
  107. };
  108. /**@brief event when user wants to end loading of bullets
  109. **/
  110. class WeaponEventContinuousLoadBulletEnd extends WeaponEventBase
  111. {
  112. void WeaponEventContinuousLoadBulletEnd (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.CONTINUOUS_LOADBULLET_END; }
  113. };
  114. /**@brief event when user wants to unjam weapon
  115. **/
  116. class WeaponEventUnjam extends WeaponEventBase
  117. {
  118. void WeaponEventUnjam (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.UNJAM; }
  119. };
  120. /**@brief event when user wants to attach magazine
  121. **/
  122. class WeaponEventAttachMagazine extends WeaponEventBase
  123. {
  124. void WeaponEventAttachMagazine (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.ATTACH_MAGAZINE; }
  125. };
  126. /**@brief triggered when unjamming timer expires
  127. **/
  128. class WeaponEventUnjammingFailedTimeout extends WeaponEventBase
  129. {
  130. void WeaponEventUnjammingFailedTimeout (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.UNJAMMING_FAILED_TIMEOUT; }
  131. };
  132. /**@brief triggered when unjamming failed timer expires
  133. **/
  134. class WeaponEventUnjammingTimeout extends WeaponEventBase
  135. {
  136. void WeaponEventUnjammingTimeout (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.UNJAMMING_TIMEOUT; }
  137. };
  138. /**@brief event when user wants to detach magazine
  139. * @param dst \p inventory location where the magazine will be stored
  140. **/
  141. class WeaponEventDetachMagazine extends WeaponEventBase
  142. {
  143. ref InventoryLocation m_dst;
  144. void WeaponEventDetachMagazine (DayZPlayer p = NULL, Magazine m = NULL, InventoryLocation il = NULL) { m_eventID = WeaponEventID.DETACH_MAGAZINE; m_dst = il; }
  145. override void ReadFromContext (ParamsReadContext ctx)
  146. {
  147. m_dst = new InventoryLocation;
  148. super.ReadFromContext(ctx);
  149. m_dst.ReadFromContext(ctx);
  150. }
  151. override void WriteToContext (ParamsWriteContext ctx)
  152. {
  153. super.WriteToContext(ctx);
  154. m_dst.WriteToContext(ctx);
  155. }
  156. };
  157. /**@brief event when user wants to swap magazine
  158. **/
  159. class WeaponEventSwapMagazine extends WeaponEventBase
  160. {
  161. ref InventoryLocation m_dst;
  162. void WeaponEventSwapMagazine (DayZPlayer p = NULL, Magazine m = NULL, InventoryLocation il = NULL){ m_eventID = WeaponEventID.SWAP_MAGAZINE;m_dst = il; }
  163. override void ReadFromContext (ParamsReadContext ctx)
  164. {
  165. super.ReadFromContext(ctx);
  166. m_dst = new InventoryLocation;
  167. m_dst.ReadFromContext(ctx);
  168. }
  169. override void WriteToContext (ParamsWriteContext ctx)
  170. {
  171. super.WriteToContext(ctx);
  172. m_dst.WriteToContext(ctx);
  173. }
  174. };
  175. /**@brief triggered when animation action finishes
  176. **/
  177. class WeaponEventHumanCommandActionFinished extends WeaponEventBase
  178. {
  179. void WeaponEventHumanCommandActionFinished (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.HUMANCOMMAND_ACTION_FINISHED; }
  180. };
  181. /**@brief triggered when animation action aborts
  182. **/
  183. class WeaponEventHumanCommandActionAborted extends WeaponEventBase
  184. {
  185. void WeaponEventHumanCommandActionAborted (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.HUMANCOMMAND_ACTION_ABORTED; }
  186. };
  187. /**@brief triggered when reload timer expires
  188. **/
  189. class WeaponEventReloadTimeout extends WeaponEventBase
  190. {
  191. void WeaponEventReloadTimeout (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.RELOAD_TIMEOUT; }
  192. };
  193. /**@brief triggered when dry fire timer expires
  194. **/
  195. class WeaponEventDryFireTimeout extends WeaponEventBase
  196. {
  197. void WeaponEventDryFireTimeout (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.DRY_FIRE_TIMEOUT; }
  198. };
  199. /**@brief triggered when dry fire timer expires
  200. **/
  201. class WeaponEventSetNextMuzzleMode extends WeaponEventBase
  202. {
  203. void WeaponEventSetNextMuzzleMode (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.SET_NEXT_MUZZLE_MODE; }
  204. };
  205. class WeaponEventAnimation extends WeaponEventBase
  206. {
  207. WeaponEvents m_type; /// animation event from Human.WeaponEvents
  208. void WeaponEventAnimation (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.ANIMATION_EVENT; }
  209. override int GetAnimEvent () { return m_type; }
  210. };
  211. /// creates weapon fsm events
  212. WeaponEventBase WeaponEventFactory (WeaponEventID id, int aetype, DayZPlayer p = NULL, Magazine m = NULL)
  213. {
  214. switch (id)
  215. {
  216. case WeaponEventID.UNKNOWN: return null;
  217. case WeaponEventID.MECHANISM: return new WeaponEventMechanism(p, m);
  218. case WeaponEventID.TRIGGER: return new WeaponEventTrigger(p, m);
  219. case WeaponEventID.TRIGGER_JAM: return new WeaponEventTriggerToJam(p, m);
  220. case WeaponEventID.LOAD1_BULLET: return new WeaponEventLoad1Bullet(p, m);
  221. case WeaponEventID.CONTINUOUS_LOADBULLET_START: return new WeaponEventContinuousLoadBulletStart(p, m);
  222. case WeaponEventID.CONTINUOUS_LOADBULLET_END: return new WeaponEventContinuousLoadBulletEnd(p, m);
  223. case WeaponEventID.UNJAM: return new WeaponEventUnjam(p, m);
  224. case WeaponEventID.ATTACH_MAGAZINE: return new WeaponEventAttachMagazine(p, m);
  225. case WeaponEventID.UNJAMMING_FAILED_TIMEOUT: return new WeaponEventUnjammingFailedTimeout(p, m);
  226. case WeaponEventID.UNJAMMING_TIMEOUT: return new WeaponEventUnjammingTimeout(p, m);
  227. case WeaponEventID.DETACH_MAGAZINE: return new WeaponEventDetachMagazine(p, m);
  228. case WeaponEventID.SWAP_MAGAZINE: return new WeaponEventSwapMagazine(p, m);
  229. case WeaponEventID.HUMANCOMMAND_ACTION_FINISHED: return new WeaponEventHumanCommandActionFinished(p, m);
  230. case WeaponEventID.HUMANCOMMAND_ACTION_ABORTED: return new WeaponEventHumanCommandActionAborted(p, m);
  231. case WeaponEventID.RELOAD_TIMEOUT: return new WeaponEventReloadTimeout(p, m);
  232. case WeaponEventID.DRY_FIRE_TIMEOUT: return new WeaponEventDryFireTimeout(p, m);
  233. case WeaponEventID.SET_NEXT_MUZZLE_MODE: return new WeaponEventSetNextMuzzleMode(p, m);
  234. case WeaponEventID.ANIMATION_EVENT: return WeaponAnimEventFactory(aetype, p, m);
  235. }
  236. return NULL;
  237. }
  238. /// creates animation system events
  239. WeaponEventBase WeaponAnimEventFactory (WeaponEvents type, DayZPlayer p = NULL, Magazine m = NULL)
  240. {
  241. switch (type)
  242. {
  243. case WeaponEvents.ATTACHMENT_HIDE: return new WeaponEventAnimAttachmentHide(p, m);
  244. case WeaponEvents.ATTACHMENT_SHOW: return new WeaponEventAnimAttachmentShow(p, m);
  245. case WeaponEvents.BULLET_EJECT: return new WeaponEventAnimBulletEject(p, m);
  246. case WeaponEvents.BULLET_HIDE: return new WeaponEventAnimBulletHide(p, m);
  247. case WeaponEvents.BULLET_HIDE2: return new WeaponEventAnimBulletHide2(p, m);
  248. case WeaponEvents.BULLET_IN_CHAMBER: return new WeaponEventAnimBulletInChamber(p, m);
  249. case WeaponEvents.BULLET_IN_MAGAZINE: return new WeaponEventAnimBulletInMagazine(p, m);
  250. case WeaponEvents.BULLET_SHOW: return new WeaponEventAnimBulletShow(p, m);
  251. case WeaponEvents.BULLET_SHOW2: return new WeaponEventAnimBulletShow2(p, m);
  252. case WeaponEvents.CANUNJAM_END: return new WeaponEventAnimCanUnjamEnd(p, m);
  253. case WeaponEvents.CANUNJAM_START: return new WeaponEventAnimCanUnjamStart(p, m);
  254. case WeaponEvents.COCKED: return new WeaponEventAnimCocked(p, m);
  255. case WeaponEvents.MAGAZINE_ATTACHED: return new WeaponEventAnimMagazineAttached(p, m);
  256. case WeaponEvents.MAGAZINE_DETACHED: return new WeaponEventAnimMagazineDetached(p, m);
  257. case WeaponEvents.MAGAZINE_HIDE: return new WeaponEventAnimMagazineHide(p, m);
  258. case WeaponEvents.MAGAZINE_SHOW: return new WeaponEventAnimMagazineShow(p, m);
  259. case WeaponEvents.SLIDER_OPEN: return new WeaponEventAnimSliderOpen(p, m);
  260. case WeaponEvents.UNJAMMED: return new WeaponEventAnimUnjammed(p, m);
  261. case WeaponEvents.HAMMER_UNCOCKED: return new WeaponEventAnimHammerUncocked(p, m);
  262. case WeaponEvents.HAMMER_COCKED: return new WeaponEventAnimHammerCocked(p, m);
  263. case WeaponEvents.CYLINDER_ROTATE: return new WeaponEventCylinderRotate(p, m);
  264. //case WeaponEvents.: return new WeaponEventAnim(p, m);
  265. }
  266. return NULL;
  267. }
  268. WeaponEventBase CreateWeaponEventFromContext (ParamsReadContext ctx)
  269. {
  270. int packedType;
  271. ctx.Read(packedType);
  272. DayZPlayer player;
  273. ctx.Read(player);
  274. Magazine magazine;
  275. ctx.Read(magazine);
  276. WeaponEventID eventID = packedType >> 16;
  277. WeaponEvents animEvent = packedType & 0x0000ffff;
  278. WeaponEventBase b = WeaponEventFactory(eventID, animEvent, player, magazine);
  279. b.ReadFromContext(ctx);
  280. return b;
  281. }
  282. class WeaponEventAnimAttachmentHide extends WeaponEventAnimation
  283. {
  284. void WeaponEventAnimAttachmentHide (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.ATTACHMENT_HIDE; }
  285. };
  286. class WeaponEventAnimAttachmentShow extends WeaponEventAnimation
  287. {
  288. void WeaponEventAnimAttachmentShow (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.ATTACHMENT_SHOW; }
  289. };
  290. class WeaponEventAnimBulletEject extends WeaponEventAnimation
  291. {
  292. void WeaponEventAnimBulletEject (DayZPlayer p = NULL, Magazine m = NULL)
  293. {
  294. m_type = WeaponEvents.BULLET_EJECT;
  295. // Particles for ejecting bullet casings
  296. PlayerBase player = PlayerBase.Cast(p);
  297. if (player)
  298. {
  299. ItemBase weapon = player.GetItemInHands();
  300. if (weapon && weapon.GetOverheatingValue() > 0)
  301. {
  302. Weapon_Base weapon_base = Weapon_Base.Cast(weapon);
  303. ItemBase suppressor;
  304. if (weapon_base)
  305. suppressor = weapon_base.GetAttachedSuppressor();
  306. ItemBase.PlayBulletCasingEjectParticles(weapon, "", weapon, suppressor, "CfgWeapons" );
  307. }
  308. }
  309. }
  310. };
  311. class WeaponEventCylinderRotate extends WeaponEventAnimation
  312. {
  313. void WeaponEventCylinderRotate (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.CYLINDER_ROTATE; }
  314. };
  315. class WeaponEventAnimBulletHide extends WeaponEventAnimation
  316. {
  317. void WeaponEventAnimBulletHide (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_HIDE; }
  318. };
  319. class WeaponEventAnimBulletHide2 extends WeaponEventAnimation
  320. {
  321. void WeaponEventAnimBulletHide2 (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_HIDE2; }
  322. };
  323. class WeaponEventAnimBulletInChamber extends WeaponEventAnimation
  324. {
  325. void WeaponEventAnimBulletInChamber (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_IN_CHAMBER; }
  326. };
  327. class WeaponEventAnimBulletInMagazine extends WeaponEventAnimation
  328. {
  329. void WeaponEventAnimBulletInMagazine (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_IN_MAGAZINE; }
  330. };
  331. class WeaponEventAnimBulletShow extends WeaponEventAnimation
  332. {
  333. void WeaponEventAnimBulletShow (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_SHOW; }
  334. };
  335. class WeaponEventAnimBulletShow2 extends WeaponEventAnimation
  336. {
  337. void WeaponEventAnimBulletShow2 (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_SHOW2; }
  338. };
  339. class WeaponEventAnimCanUnjamEnd extends WeaponEventAnimation
  340. {
  341. void WeaponEventAnimCanUnjamEnd (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.CANUNJAM_END; }
  342. };
  343. class WeaponEventAnimCanUnjamStart extends WeaponEventAnimation
  344. {
  345. void WeaponEventAnimCanUnjamStart (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.CANUNJAM_START; }
  346. };
  347. class WeaponEventAnimCocked extends WeaponEventAnimation
  348. {
  349. void WeaponEventAnimCocked (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.COCKED; }
  350. };
  351. class WeaponEventAnimMagazineAttached extends WeaponEventAnimation
  352. {
  353. void WeaponEventAnimMagazineAttached (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.MAGAZINE_ATTACHED; }
  354. };
  355. class WeaponEventAnimMagazineDetached extends WeaponEventAnimation
  356. {
  357. void WeaponEventAnimMagazineDetached (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.MAGAZINE_DETACHED; }
  358. };
  359. class WeaponEventAnimMagazineHide extends WeaponEventAnimation
  360. {
  361. void WeaponEventAnimMagazineHide (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.MAGAZINE_HIDE; }
  362. };
  363. class WeaponEventAnimMagazineShow extends WeaponEventAnimation
  364. {
  365. void WeaponEventAnimMagazineShow (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.MAGAZINE_SHOW; }
  366. };
  367. class WeaponEventAnimSliderOpen extends WeaponEventAnimation
  368. {
  369. void WeaponEventAnimSliderOpen (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.SLIDER_OPEN; }
  370. };
  371. class WeaponEventAnimUnjammed extends WeaponEventAnimation
  372. {
  373. void WeaponEventAnimUnjammed (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.UNJAMMED; }
  374. };
  375. class WeaponEventAnimHammerUncocked extends WeaponEventAnimation
  376. {
  377. void WeaponEventAnimHammerUncocked (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.HAMMER_UNCOCKED; }
  378. };
  379. class WeaponEventAnimHammerCocked extends WeaponEventAnimation
  380. {
  381. void WeaponEventAnimHammerCocked (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.HAMMER_COCKED; }
  382. };
  383. /*
  384. class WeaponEventAnim extends WeaponEventAnimation
  385. {
  386. void WeaponEventAnim (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.; }
  387. };
  388. */