weaponfire.c 8.3 KB

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