weaponfire.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. // fire
  2. class WeaponDryFire extends WeaponStartAction
  3. {
  4. float m_dtAccumulator;
  5. override void OnEntry (WeaponEventBase e)
  6. {
  7. super.OnEntry(e);
  8. if (e)
  9. {
  10. m_dtAccumulator = 0;
  11. }
  12. m_weapon.ResetBurstCount();
  13. }
  14. override bool IsWaitingForActionFinish () { return true; }
  15. override void OnUpdate (float dt)
  16. {
  17. m_dtAccumulator += dt;
  18. DayZPlayer p;
  19. Class.CastTo(p, m_weapon.GetHierarchyParent());
  20. if (p)
  21. {
  22. HumanInputController hic = p.GetInputController();
  23. int muzzleIndex = m_weapon.GetCurrentMuzzle();
  24. float reloadTime = m_weapon.GetReloadTime(muzzleIndex);
  25. if ( hic.IsAttackButton() && m_dtAccumulator >= reloadTime)
  26. if (m_weapon.CanProcessWeaponEvents())
  27. m_weapon.ProcessWeaponEvent(new WeaponEventDryFireTimeout(p));
  28. }
  29. }
  30. override void OnExit (WeaponEventBase e)
  31. {
  32. m_dtAccumulator = 0;
  33. super.OnExit(e);
  34. }
  35. };
  36. // fire
  37. class WeaponFire extends WeaponStartAction
  38. {
  39. float m_dtAccumulator;
  40. override bool IsWaitingForActionFinish () { return true; }
  41. override void OnEntry (WeaponEventBase e)
  42. {
  43. if (e)
  44. {
  45. m_dtAccumulator = 0;
  46. if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponFire bang!"); }
  47. //m_weapon.Fire();
  48. int mi = m_weapon.GetCurrentMuzzle();
  49. if (TryFireWeapon(m_weapon, mi))
  50. {
  51. DayZPlayerImplement p;
  52. if (Class.CastTo(p, e.m_player))
  53. p.GetAimingModel().SetRecoil(m_weapon);
  54. m_weapon.OnFire(mi);
  55. }
  56. }
  57. super.OnEntry(e);
  58. }
  59. override void OnUpdate (float dt)
  60. {
  61. m_dtAccumulator += dt;
  62. DayZPlayer p;
  63. Class.CastTo(p, m_weapon.GetHierarchyParent());
  64. int muzzleIndex = m_weapon.GetCurrentMuzzle();
  65. float reloadTime = m_weapon.GetReloadTime(muzzleIndex);
  66. if (m_dtAccumulator >= reloadTime)
  67. if (m_weapon.CanProcessWeaponEvents())
  68. m_weapon.ProcessWeaponEvent(new WeaponEventReloadTimeout(p));
  69. }
  70. override void OnExit (WeaponEventBase e)
  71. {
  72. if (e)
  73. m_dtAccumulator = 0;
  74. super.OnExit(e);
  75. }
  76. override void OnAbort (WeaponEventBase e)
  77. {
  78. m_weapon.ResetBurstCount();
  79. super.OnAbort(e);
  80. }
  81. };
  82. class WeaponFireWithEject extends WeaponFire
  83. {
  84. override void OnEntry (WeaponEventBase e)
  85. {
  86. m_dtAccumulator = 0;
  87. if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponFire bang!"); }
  88. //m_weapon.Fire();
  89. int mi = m_weapon.GetCurrentMuzzle();
  90. if (TryFireWeapon(m_weapon, mi))
  91. {
  92. DayZPlayerImplement p;
  93. if (Class.CastTo(p, e.m_player))
  94. p.GetAimingModel().SetRecoil(m_weapon);
  95. m_weapon.EjectCasing(mi);
  96. m_weapon.EffectBulletHide(mi);
  97. m_weapon.OnFire(mi);
  98. }
  99. super.OnEntry(e);
  100. }
  101. }
  102. // fire
  103. class WeaponFireMultiMuzzle extends WeaponStartAction
  104. {
  105. float m_dtAccumulator;
  106. override bool IsWaitingForActionFinish () { return true; }
  107. override void OnEntry (WeaponEventBase e)
  108. {
  109. if (e)
  110. {
  111. m_dtAccumulator = 0;
  112. if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponFire bang bang!"); }
  113. int mi = m_weapon.GetCurrentMuzzle();
  114. int b = m_weapon.GetCurrentModeBurstSize(mi);
  115. if (b > 1)
  116. {
  117. for (int i = 0; i < b; i++)
  118. {
  119. if (TryFireWeapon(m_weapon, i))
  120. {
  121. DayZPlayerImplement p1;
  122. if (Class.CastTo(p1, e.m_player))
  123. p1.GetAimingModel().SetRecoil(m_weapon);
  124. m_weapon.OnFire(i);
  125. }
  126. }
  127. }
  128. else
  129. {
  130. if (TryFireWeapon(m_weapon, mi))
  131. {
  132. DayZPlayerImplement p;
  133. if (Class.CastTo(p, e.m_player))
  134. p.GetAimingModel().SetRecoil(m_weapon);
  135. m_weapon.OnFire(mi);
  136. }
  137. }
  138. if (mi >= m_weapon.GetMuzzleCount() - 1)
  139. m_weapon.SetCurrentMuzzle(0);
  140. else
  141. m_weapon.SetCurrentMuzzle(mi + 1);
  142. }
  143. super.OnEntry(e);
  144. }
  145. override void OnUpdate (float dt)
  146. {
  147. m_dtAccumulator += dt;
  148. DayZPlayer p;
  149. Class.CastTo(p, m_weapon.GetHierarchyParent());
  150. int muzzleIndex = m_weapon.GetCurrentMuzzle();
  151. float reloadTime = m_weapon.GetReloadTime(muzzleIndex);
  152. if (m_dtAccumulator >= reloadTime)
  153. if (m_weapon.CanProcessWeaponEvents())
  154. m_weapon.ProcessWeaponEvent(new WeaponEventReloadTimeout(p));
  155. }
  156. override void OnExit (WeaponEventBase e)
  157. {
  158. if (e)
  159. m_dtAccumulator = 0;
  160. super.OnExit(e);
  161. }
  162. override void OnAbort (WeaponEventBase e)
  163. {
  164. m_weapon.ResetBurstCount();
  165. super.OnAbort(e);
  166. }
  167. };
  168. class WeaponFireMagnum extends WeaponFireMultiMuzzle
  169. {
  170. override void OnEntry (WeaponEventBase e)
  171. {
  172. super.OnEntry(e);
  173. if (e)
  174. {
  175. Magnum_Cylinder cylinder = Magnum_Cylinder.Cast(m_weapon.GetAttachmentByType(Magnum_Cylinder));
  176. Magnum_Ejector ejector = Magnum_Ejector.Cast(m_weapon.GetAttachmentByType(Magnum_Ejector));
  177. if(cylinder && ejector)
  178. {
  179. float a;
  180. int mi = m_weapon.GetCurrentMuzzle();
  181. switch(mi)
  182. {
  183. case 0:
  184. a = MAGNUM_ROTATION_POSITION_0;
  185. break;
  186. case 1:
  187. a = MAGNUM_ROTATION_POSITION_5;
  188. cylinder.ResetAnimationPhase("Rotate_Cylinder", MAGNUM_ROTATION_POSITION_6 );
  189. ejector.ResetAnimationPhase("Rotate_Ejector", MAGNUM_ROTATION_POSITION_6 );
  190. break;
  191. case 2:
  192. a = MAGNUM_ROTATION_POSITION_4;
  193. break;
  194. case 3:
  195. a = MAGNUM_ROTATION_POSITION_3;
  196. break;
  197. case 4:
  198. a = MAGNUM_ROTATION_POSITION_2;
  199. break;
  200. case 5:
  201. a = MAGNUM_ROTATION_POSITION_1;
  202. break;
  203. }
  204. cylinder.SetAnimationPhase("Rotate_Cylinder", a );
  205. ejector.SetAnimationPhase("Rotate_Ejector", a );
  206. }
  207. }
  208. }
  209. override void OnUpdate (float dt)
  210. {
  211. m_dtAccumulator += dt;
  212. DayZPlayer p;
  213. Class.CastTo(p, m_weapon.GetHierarchyParent());
  214. int muzzleIndex = m_weapon.GetCurrentMuzzle();
  215. float reloadTime = m_weapon.GetReloadTime(muzzleIndex);
  216. if (m_dtAccumulator >= reloadTime)
  217. if (m_weapon.CanProcessWeaponEvents())
  218. m_weapon.ProcessWeaponEvent(new WeaponEventReloadTimeout(p));
  219. }
  220. override void OnExit (WeaponEventBase e)
  221. {
  222. if (e)
  223. m_dtAccumulator = 0;
  224. super.OnExit(e);
  225. }
  226. };
  227. // fire to jam
  228. class WeaponFireToJam extends WeaponStartAction
  229. {
  230. float m_dtAccumulator;
  231. override bool IsWaitingForActionFinish () { return true; }
  232. override void OnEntry (WeaponEventBase e)
  233. {
  234. if (e)
  235. {
  236. m_dtAccumulator = 0;
  237. if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponFire bang! and jam?"); }
  238. //m_weapon.Fire();
  239. int mi = m_weapon.GetCurrentMuzzle();
  240. if (TryFireWeapon(m_weapon, mi))
  241. {
  242. m_weapon.SetJammed(true);
  243. DayZPlayerImplement p;
  244. if (Class.CastTo(p, e.m_player))
  245. p.GetAimingModel().SetRecoil(m_weapon);
  246. m_weapon.OnFire(mi);
  247. }
  248. }
  249. m_weapon.ResetBurstCount();
  250. super.OnEntry(e);
  251. }
  252. override void OnUpdate (float dt)
  253. {
  254. m_dtAccumulator += dt;
  255. DayZPlayer p;
  256. Class.CastTo(p, m_weapon.GetHierarchyParent());
  257. int muzzleIndex = m_weapon.GetCurrentMuzzle();
  258. float reloadTime = m_weapon.GetReloadTime(muzzleIndex);
  259. if (m_dtAccumulator >= reloadTime)
  260. if (m_weapon.CanProcessWeaponEvents())
  261. m_weapon.ProcessWeaponEvent(new WeaponEventReloadTimeout(p));
  262. }
  263. override void OnExit (WeaponEventBase e)
  264. {
  265. m_dtAccumulator = 0;
  266. super.OnExit(e);
  267. }
  268. };
  269. class WeaponFireAndChamber extends WeaponFire
  270. {
  271. override void OnEntry (WeaponEventBase e)
  272. {
  273. super.OnEntry(e);
  274. if (e)
  275. {
  276. if (GetGame().IsServer())
  277. {
  278. PlayerBase playerOwner;
  279. Class.CastTo(playerOwner, m_weapon.GetHierarchyParent());
  280. m_weapon.AddJunctureToAttachedMagazine(playerOwner, 100);
  281. }
  282. if (!m_weapon.IsJammed())
  283. {
  284. if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " ejected fired out casing"); }
  285. int mi = m_weapon.GetCurrentMuzzle();
  286. m_weapon.EjectCasing(mi);
  287. m_weapon.EffectBulletHide(mi);
  288. m_weapon.SelectionBulletHide();
  289. pushToChamberFromAttachedMagazine(m_weapon, mi);
  290. }
  291. }
  292. }
  293. override void OnExit (WeaponEventBase e)
  294. {
  295. super.OnExit(e);
  296. if (GetGame().IsServer())
  297. {
  298. PlayerBase playerOwner;
  299. Class.CastTo(playerOwner, m_weapon.GetHierarchyParent());
  300. m_weapon.ClearJunctureToAttachedMagazine(playerOwner);
  301. }
  302. }
  303. };
  304. class WeaponFireAndChamberFromInnerMagazine extends WeaponFire
  305. {
  306. override void OnEntry (WeaponEventBase e)
  307. {
  308. super.OnEntry(e);
  309. if (!m_weapon.IsJammed())
  310. {
  311. if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " ejected fired out casing"); }
  312. int mi = m_weapon.GetCurrentMuzzle();
  313. m_weapon.EjectCasing(mi);
  314. m_weapon.EffectBulletHide(mi);
  315. m_weapon.SelectionBulletHide();
  316. pushToChamberFromInnerMagazine(m_weapon, mi);
  317. }
  318. }
  319. };