DayZ Scripts
v1.21.156300 ยท Jun 20, 2023
 
Loading...
Searching...
No Matches
Pistol_Base.c
Go to the documentation of this file.
3{
4 DEFAULT = 0,
7 JAMMED = 3
8};
9
10// naming convention of the states respect following order:
11// closed/opened | charged/discharged | bullet/nobullet | magazine/nomag
13{
14 UNKNOWN = 0,
24 OPE_DIS_BU0_MA1 = 10,
25}
26
27class Pistol_CLO_DIS_BU0_MA0 extends WeaponStableState
28{
29 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CD00 closed dischgd nobull nomag"); } super.OnEntry(e); }
30 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CD00 closed dischgd nobull nomag"); } }
31 override int GetCurrentStateID () { return PistolStableStateID.CLO_DIS_BU0_MA0; }
32 override bool HasBullet () { return false; }
33 override bool HasMagazine () { return false; }
34 override bool IsJammed () { return false; }
35 override bool IsRepairEnabled () { return true; }
36 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
37};
38class Pistol_CLO_CHG_BU0_MA0 extends WeaponStableState
40 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CC00 closed charged nobull nomag"); } super.OnEntry(e); }
41 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CC00 closed charged nobull nomag"); } }
42 override int GetCurrentStateID () { return PistolStableStateID.CLO_CHG_BU0_MA0; }
43 override bool HasBullet () { return false; }
44 override bool HasMagazine () { return false; }
45 override bool IsJammed () { return false; }
46 override bool IsRepairEnabled () { return true; }
47 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
48};
49class Pistol_CLO_CHG_BU1_MA0 extends WeaponStableState
50{
51 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CC10 closed charged bullet nomag"); } super.OnEntry(e); }
52 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CC10 closed charged bullet nomag"); } }
53 override int GetCurrentStateID () { return PistolStableStateID.CLO_CHG_BU1_MA0; }
54 override bool HasBullet () { return true; }
55 override bool HasMagazine () { return false; }
56 override bool IsJammed () { return false; }
57 override bool IsRepairEnabled () { return true; }
58 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
59};
60class Pistol_CLO_JAM_BU1_MA0 extends WeaponStateJammed
61{
62 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CJF0 closed jammed bullet nomag"); } super.OnEntry(e); }
63 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CJF0 closed jammed bullet nomag"); } }
64 override int GetCurrentStateID () { return PistolStableStateID.CLO_JAM_BU1_MA0; }
65 override bool HasBullet () { return true; }
66 override bool HasMagazine () { return false; }
67 override bool IsJammed () { return true; }
68 override bool IsBoltOpen () { return true; }
69 override bool IsRepairEnabled () { return true; }
70 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
71};
72class Pistol_OPE_DIS_BU0_MA0 extends WeaponStableState
73{
74 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { OD00 opened dischgd nobullet nomag"); } super.OnEntry(e); }
75 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } 0D00 opened dischgd nobullet nomag"); } }
76 override int GetCurrentStateID () { return PistolStableStateID.OPE_DIS_BU0_MA0; }
77 override bool HasBullet () { return false; }
78 override bool HasMagazine () { return false; }
79 override bool IsJammed () { return false; }
80 override bool IsBoltOpen () { return true; }
81 override bool IsRepairEnabled () { return true; }
82 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
83};
84class Pistol_CLO_CHG_BU0_MA1 extends WeaponStableState
85{
86 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CC01 closed charged nobullet mag"); } super.OnEntry(e); }
87 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CC01 closed charged nobullet mag"); } }
88 override int GetCurrentStateID () { return PistolStableStateID.CLO_CHG_BU0_MA1; }
89 override bool HasBullet () { return false; }
90 override bool HasMagazine () { return true; }
91 override bool IsJammed () { return false; }
92 override bool IsRepairEnabled () { return true; }
93 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
94};
95class Pistol_CLO_DIS_BU0_MA1 extends WeaponStableState
96{
97 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CD01 closed dischgd nobullet mag"); } super.OnEntry(e); }
98 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CD01 closed dischgd nobullet mag"); } }
99 override int GetCurrentStateID () { return PistolStableStateID.CLO_DIS_BU0_MA1; }
100 override bool HasBullet () { return false; }
101 override bool HasMagazine () { return true; }
102 override bool IsJammed () { return false; }
103 override bool IsRepairEnabled () { return true; }
105};
106class Pistol_CLO_JAM_BU1_MA1 extends WeaponStateJammed
107{
108 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CJF1 closed jammed bullet mag"); } super.OnEntry(e); }
109 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CJF1 closed jammed bullet mag"); } }
110 override int GetCurrentStateID () { return PistolStableStateID.CLO_JAM_BU1_MA1; }
111 override bool HasBullet () { return true; }
112 override bool HasMagazine () { return true; }
113 override bool IsJammed () { return true; }
114 override bool IsBoltOpen () { return true; }
115 override bool IsRepairEnabled () { return true; }
117};
118class Pistol_CLO_CHG_BU1_MA1 extends WeaponStableState
119{
120 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CC11 closed charged bullet mag"); } super.OnEntry(e); }
121 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CC11 closed charged bullet mag"); } }
122 override int GetCurrentStateID () { return PistolStableStateID.CLO_CHG_BU1_MA1; }
123 override bool HasBullet () { return true; }
124 override bool HasMagazine () { return true; }
125 override bool IsJammed () { return false; }
126 override bool IsRepairEnabled () { return true; }
128};
129class Pistol_OPE_DIS_BU0_MA1 extends WeaponStableState
130{
131 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { OD01 opened dischgd nobullet mag"); } super.OnEntry(e); }
132 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } 0D01 opened dischgd nobullet mag"); } }
133 override int GetCurrentStateID () { return PistolStableStateID.OPE_DIS_BU0_MA1; }
134 override bool HasBullet () { return false; }
135 override bool HasMagazine () { return true; }
136 override bool IsJammed () { return false; }
137 override bool IsBoltOpen () { return true; }
138 override bool IsRepairEnabled () { return true; }
140};
141
142
147class Pistol_Base extends Weapon_Base
148{
159
160 override bool CanChamberBullet (int muzzleIndex, Magazine mag)
161 {
162 return super.CanChamberBullet(muzzleIndex,mag) && IsChamberEmpty(muzzleIndex);
163 }
164
166 {
167 }
168
169 override void InitStateMachine ()
170 {
171 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_BULLET_CLOSED));
172 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_BULLET_CLOSED));
173 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_CLOSED_COCKED));
174 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_CLOSED_COCKED));
175 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_CLOSED_UNCOCKED));
176 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_CLOSED_UNCOCKED));
177 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_OPENED));
178 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_OPENED));
179 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH));
180
181 m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED));
182 m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_OPENED));
183
184 m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
185 m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
186 m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED_UNCOCKED));
187
188 m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
189 m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END));
190
191 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
192 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_LAST));
193 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED));
194 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED));
195 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));
196
197 // setup state machine
198 // basic weapon states
199 // open-closed | discharged-charged | nobullet-bullet | nomag-mag
200 // regexp: [OC][CDJ][01][01]
201 CD00 = new Pistol_CLO_DIS_BU0_MA0(this, NULL, PistolAnimState.DEFAULT);
202 CC00 = new Pistol_CLO_CHG_BU0_MA0(this, NULL, PistolAnimState.CLOSED_CHARGED);
203 CC10 = new Pistol_CLO_CHG_BU1_MA0(this, NULL, PistolAnimState.CLOSED_CHARGED);
204 CJF0 = new Pistol_CLO_JAM_BU1_MA0(this, NULL, PistolAnimState.JAMMED);
205 OD00 = new Pistol_OPE_DIS_BU0_MA0(this, NULL, PistolAnimState.OPENED_DISCHARGED);
206 CD01 = new Pistol_CLO_DIS_BU0_MA1(this, NULL, PistolAnimState.DEFAULT);
207 CC01 = new Pistol_CLO_CHG_BU0_MA1(this, NULL, PistolAnimState.CLOSED_CHARGED);
208 CC11 = new Pistol_CLO_CHG_BU1_MA1(this, NULL, PistolAnimState.CLOSED_CHARGED);
209 CJF1 = new Pistol_CLO_JAM_BU1_MA1(this, NULL, PistolAnimState.JAMMED);
210 OD01 = new Pistol_OPE_DIS_BU0_MA1(this, NULL, PistolAnimState.OPENED_DISCHARGED);
211
212 // unstable (intermediate) states
213 WeaponCharging Mech_CD00 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED_UNCOCKED);
214 WeaponCharging Mech_CC00 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
215 WeaponCharging Mech_CD01 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED_UNCOCKED);
216 WeaponCharging Mech_CC01 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
217 WeaponCharging Mech_OD00 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED);
218 WeaponCharging Mech_OD01 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED);
219
220 WeaponCharging Mech_CC10 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED); // eject with no mag
221 WeaponCharging Mech_CC11 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED); // eject with mag
222
223
224 WeaponDryFire Trigger_CC00 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED); // cock without clip
225 WeaponDryFire Trigger_CD00 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED);
226 WeaponDryFire Trigger_OD00 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED);
227 WeaponDryFire Trigger_CD01 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED);
228 WeaponDryFire Trigger_OD01 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED);
229 WeaponDryFire Trigger_CC01 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED); // cock with clip
230 WeaponDryFire Trigger_CJF0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED);
231 WeaponDryFire Trigger_CJF1 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED);
232
233 WeaponFireAndChamberNext Trigger_CC11 = new WeaponFireAndChamberNext(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
234 WeaponStateBase Trigger_CC10 = new WeaponFireLast(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL); // fire last no mag
235 WeaponStateBase Trigger_CC11L = new WeaponFireLast(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_LAST); // fire last with mag
236
237 WeaponStateBase Trigger_CC10J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM);
238 WeaponStateBase Trigger_CC11J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM);
239
240 WeaponStateBase Unjam_CJF0 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START);
241 WeaponStateBase Unjam_CJF1 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START);
242
243 WeaponChambering Chamber_CD00 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED_UNCOCKED);
244 WeaponChambering Chamber_CC00 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED);
245 WeaponChambering Chamber_OD00 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_OPENED);
246 WeaponChambering Chamber_CD01 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED_UNCOCKED);
247 WeaponChambering Chamber_CC01 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED);
248 WeaponChambering Chamber_OD01 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_OPENED);
249
250 WeaponAttachMagazine Attach_CC10 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_BULLET_CLOSED);
251 WeaponAttachMagazine Attach_CJF0 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_BULLET_CLOSED);
252 WeaponAttachMagazine Attach_CD00 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_CLOSED_UNCOCKED);
253 WeaponAttachMagazine Attach_CC00 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_CLOSED_COCKED);
254 WeaponAttachMagazine Attach_OD00 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_OPENED);
255
256 WeaponReplacingMagAndChamberNext Reload_CD01 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_CLOSED_UNCOCKED);
257 WeaponReplacingMagAndChamberNext Reload_CC01 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_CLOSED_COCKED);
258 WeaponReplacingMagAndChamberNext Reload_CC11 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_BULLET_CLOSED);
259 WeaponReplacingMagAndChamberNext Reload_CJF1 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_BULLET_CLOSED);
260 WeaponReplacingMagAndChamberNext Reload_OD01 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_OPENED);
261
262 WeaponDetachingMag Detach_CC11 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH);
263 WeaponDetachingMag Detach_CC01 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH);
264 WeaponDetachingMag Detach_CD01 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH);
265 WeaponDetachingMag Detach_OD01 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH);
266 WeaponDetachingMag Detach_CJF1 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH);
267
268 // events
269 WeaponEventBase __M__ = new WeaponEventMechanism;
270 WeaponEventBase __T__ = new WeaponEventTrigger;
271 WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
272 WeaponEventBase __U__ = new WeaponEventUnjam;
273 WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
274 WeaponEventBase __A__ = new WeaponEventAttachMagazine;
275 WeaponEventBase __D__ = new WeaponEventDetachMagazine;
276 WeaponEventBase __S__ = new WeaponEventSwapMagazine;
277 WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
278 WeaponEventBase _rto_ = new WeaponEventReloadTimeout;
279 WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
280 WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
281
282 m_fsm = new WeaponFSM();
283
284 // charging
285 m_fsm.AddTransition(new WeaponTransition( CD00, __M__, Mech_CD00)); // charge from closed
286 m_fsm.AddTransition(new WeaponTransition( Mech_CD00, _fin_, CC00));
287 Mech_CD00.AddTransition(new WeaponTransition( Mech_CD00.m_start, _abt_, CD00));
288 Mech_CD00.AddTransition(new WeaponTransition( Mech_CD00.m_eject, _abt_, CC00));
289 Mech_CD00.AddTransition(new WeaponTransition( Mech_CD00.m_onCK, _abt_, CC00));
290 Mech_CD00.AddTransition(new WeaponTransition( Mech_CD00.m_chamber, _abt_, CC00));
291
292 m_fsm.AddTransition(new WeaponTransition( CC00, __M__, Mech_CC00)); // charge from charged
293 m_fsm.AddTransition(new WeaponTransition( Mech_CC00, _fin_, CC00));
294 m_fsm.AddTransition(new WeaponTransition( Mech_CC00, _abt_, CC00));
295
296 m_fsm.AddTransition(new WeaponTransition( OD00, __M__, Mech_OD00)); // charge from opened
297 m_fsm.AddTransition(new WeaponTransition( Mech_OD00, _fin_, CC00));
298 Mech_OD00.AddTransition(new WeaponTransition( Mech_OD00.m_start, _abt_, OD00));
299 Mech_OD00.AddTransition(new WeaponTransition( Mech_OD00.m_eject, _abt_, CC00));
300 Mech_OD00.AddTransition(new WeaponTransition( Mech_OD00.m_onCK, _abt_, CC00));
301 Mech_OD00.AddTransition(new WeaponTransition( Mech_OD00.m_chamber, _abt_, CC00));
302
303 m_fsm.AddTransition(new WeaponTransition( OD01, __M__, Mech_OD01)); // charge from opened with mag
304 m_fsm.AddTransition(new WeaponTransition( Mech_OD01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
305 m_fsm.AddTransition(new WeaponTransition( Mech_OD01, _fin_, CC11));
306 Mech_OD01.AddTransition(new WeaponTransition( Mech_OD01.m_start, _abt_, OD01));
307 Mech_OD01.AddTransition(new WeaponTransition( Mech_OD01.m_eject, _abt_, CC01));
308 Mech_OD01.AddTransition(new WeaponTransition( Mech_OD01.m_onCK, _abt_, CC01));
309 Mech_OD01.AddTransition(new WeaponTransition( Mech_OD01.m_chamber, _abt_, CC11));
310
311 m_fsm.AddTransition(new WeaponTransition( CD01, __M__, Mech_CD01)); // charge from closed=1 with mag
312 m_fsm.AddTransition(new WeaponTransition( Mech_CD01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
313 m_fsm.AddTransition(new WeaponTransition( Mech_CD01, _fin_, CC11));
314 Mech_CD01.AddTransition(new WeaponTransition( Mech_CD01.m_start, _abt_, CD01));
315 Mech_CD01.AddTransition(new WeaponTransition( Mech_CD01.m_eject, _abt_, CC01));
316 Mech_CD01.AddTransition(new WeaponTransition( Mech_CD01.m_onCK, _abt_, CC01));
317 Mech_CD01.AddTransition(new WeaponTransition( Mech_CD01.m_chamber, _abt_, CC11));
318
319 m_fsm.AddTransition(new WeaponTransition( CC01, __M__, Mech_CC01)); // charge from closed/charged with mag
320 m_fsm.AddTransition(new WeaponTransition( Mech_CC01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
321 m_fsm.AddTransition(new WeaponTransition( Mech_CC01, _fin_, CC11));
322 m_fsm.AddTransition(new WeaponTransition( Mech_CC01, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
323 m_fsm.AddTransition(new WeaponTransition( Mech_CC01, _abt_, CC11));
324
325 // eject good cartridge
326 m_fsm.AddTransition(new WeaponTransition( CC10, __M__, Mech_CC10)); // eject chamber nomag
327 m_fsm.AddTransition(new WeaponTransition( Mech_CC10, _fin_, CC00));
328 m_fsm.AddTransition(new WeaponTransition( Mech_CC10, _abt_, CC00, NULL, new WeaponGuardCurrentChamberEmpty(this)));
329 m_fsm.AddTransition(new WeaponTransition( Mech_CC10, _abt_, CC10));
330
331 m_fsm.AddTransition(new WeaponTransition( CC11, __M__, Mech_CC11 )); // eject with mag with ammo
332 m_fsm.AddTransition(new WeaponTransition( Mech_CC11, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
333 m_fsm.AddTransition(new WeaponTransition( Mech_CC11, _fin_, CC11));
334 m_fsm.AddTransition(new WeaponTransition( Mech_CC11, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
335 m_fsm.AddTransition(new WeaponTransition( Mech_CC11, _abt_, CC11));
336
337 // Trigger_CC11e
338 m_fsm.AddTransition(new WeaponTransition( CC00, __T__, Trigger_CC00)); // fire.cocked
339 m_fsm.AddTransition(new WeaponTransition( Trigger_CC00, _fin_, CD00));
340 m_fsm.AddTransition(new WeaponTransition( Trigger_CC00, _dto_, CD00));
341 m_fsm.AddTransition(new WeaponTransition( Trigger_CC00, _abt_, CD00));
342
343 m_fsm.AddTransition(new WeaponTransition( CD00, __T__, Trigger_CD00)); // fire.uncocked
344 m_fsm.AddTransition(new WeaponTransition( Trigger_CD00, _fin_, CD00));
345 m_fsm.AddTransition(new WeaponTransition( Trigger_CD00, _dto_, CD00));
346 m_fsm.AddTransition(new WeaponTransition( Trigger_CD00, _abt_, CD00));
347
348 m_fsm.AddTransition(new WeaponTransition( OD00, __T__, Trigger_OD00)); // opened fire.uncocked
349 m_fsm.AddTransition(new WeaponTransition( Trigger_OD00, _fin_, OD00));
350 m_fsm.AddTransition(new WeaponTransition( Trigger_OD00, _dto_, OD00));
351 m_fsm.AddTransition(new WeaponTransition( Trigger_OD00, _abt_, OD00));
352
353 m_fsm.AddTransition(new WeaponTransition( CD01, __T__, Trigger_CD01)); // fire.uncocked w mag
354 m_fsm.AddTransition(new WeaponTransition( Trigger_CD01, _fin_, CD01));
355 m_fsm.AddTransition(new WeaponTransition( Trigger_CD01, _dto_, CD01));
356 m_fsm.AddTransition(new WeaponTransition( Trigger_CD01, _abt_, CD01));
357
358 m_fsm.AddTransition(new WeaponTransition( OD01, __T__, Trigger_OD01)); // opened fire.uncocked w mag
359 m_fsm.AddTransition(new WeaponTransition( Trigger_OD01, _fin_, OD01));
360 m_fsm.AddTransition(new WeaponTransition( Trigger_OD01, _dto_, OD01));
361 m_fsm.AddTransition(new WeaponTransition( Trigger_OD01, _abt_, OD01));
362
363 m_fsm.AddTransition(new WeaponTransition( CJF0, __T__, Trigger_CJF0)); // opened fire.uncocked w mag
364 m_fsm.AddTransition(new WeaponTransition( Trigger_CJF0, _fin_, CJF0));
365 m_fsm.AddTransition(new WeaponTransition( Trigger_CJF0, _dto_, CJF0));
366 m_fsm.AddTransition(new WeaponTransition( Trigger_CJF0, _abt_, CJF0));
367
368 m_fsm.AddTransition(new WeaponTransition( CJF1, __T__, Trigger_CJF1)); // opened fire.uncocked w mag
369 m_fsm.AddTransition(new WeaponTransition( Trigger_CJF1, _fin_, CJF1));
370 m_fsm.AddTransition(new WeaponTransition( Trigger_CJF1, _dto_, CJF1));
371 m_fsm.AddTransition(new WeaponTransition( Trigger_CJF1, _abt_, CJF1));
372
373
374 m_fsm.AddTransition(new WeaponTransition( CC10, __T__, Trigger_CC10)); // or fire.last (if not jammed)
375 m_fsm.AddTransition(new WeaponTransition( Trigger_CC10, _fin_, CC00));
376 m_fsm.AddTransition(new WeaponTransition( Trigger_CC10, _rto_, CC00));
377 m_fsm.AddTransition(new WeaponTransition( Trigger_CC10, _abt_, CC00));
378
379 m_fsm.AddTransition(new WeaponTransition( CC10, __TJ_, Trigger_CC10J)); // or fire.last (if not jammed)
380 m_fsm.AddTransition(new WeaponTransition( Trigger_CC10J, _fin_, CJF0 ));
381 m_fsm.AddTransition(new WeaponTransition( Trigger_CC10J, _rto_, CJF0 ));
382 m_fsm.AddTransition(new WeaponTransition( Trigger_CC10J, _abt_, CJF0 ));
383
384
385 m_fsm.AddTransition(new WeaponTransition( CC11, __T__, Trigger_CC11, NULL, new WeaponGuardHasAmmo(this))); // fire.normal + chamber next
386 m_fsm.AddTransition(new WeaponTransition( Trigger_CC11, _fin_, CC11));
387 m_fsm.AddTransition(new WeaponTransition( Trigger_CC11, _rto_, CC11));
388 m_fsm.AddTransition(new WeaponTransition( Trigger_CC11, _abt_, CC11));
389
390 m_fsm.AddTransition(new WeaponTransition( CC11, __T__, Trigger_CC11L, NULL, new GuardNot(new WeaponGuardHasAmmo(this)))); // fire.last with mag
391 m_fsm.AddTransition(new WeaponTransition( Trigger_CC11L, _fin_, OD01));
392 m_fsm.AddTransition(new WeaponTransition( Trigger_CC11L, _rto_, OD01));
393 m_fsm.AddTransition(new WeaponTransition( Trigger_CC11L, _abt_, OD01));
394
395 m_fsm.AddTransition(new WeaponTransition( CC11, __TJ_, Trigger_CC11J )); // fire.last with mag
396 m_fsm.AddTransition(new WeaponTransition( Trigger_CC11J, _fin_, CJF1 ));
397 m_fsm.AddTransition(new WeaponTransition( Trigger_CC11J, _rto_, CJF1 ));
398 m_fsm.AddTransition(new WeaponTransition( Trigger_CC11J, _abt_, CJF1 ));
399
400 m_fsm.AddTransition(new WeaponTransition( CC01, __T__, Trigger_CC01)); // fire.cocked with mag
401 m_fsm.AddTransition(new WeaponTransition( Trigger_CC01, _fin_, CD01));
402 m_fsm.AddTransition(new WeaponTransition( Trigger_CC01, _dto_, CD01));
403 m_fsm.AddTransition(new WeaponTransition( Trigger_CC01, _abt_, CD01));
404
405 // load cartridge
406 m_fsm.AddTransition(new WeaponTransition( CD00, __L__, Chamber_CD00)); // chamber from closed=1
407 m_fsm.AddTransition(new WeaponTransition( Chamber_CD00, _fin_, CC10));
408 Chamber_CD00.AddTransition(new WeaponTransition( Chamber_CD00.m_start, _abt_, CD00));
409 Chamber_CD00.AddTransition(new WeaponTransition( Chamber_CD00.m_eject, _abt_, OD00));
410 Chamber_CD00.AddTransition(new WeaponTransition( Chamber_CD00.m_chamber, _abt_, OD00));
411 Chamber_CD00.AddTransition(new WeaponTransition( Chamber_CD00.m_w4t, _abt_, CC10));
412
413 m_fsm.AddTransition(new WeaponTransition( OD00, __L__, Chamber_OD00)); // chamber from opened
414 m_fsm.AddTransition(new WeaponTransition( Chamber_OD00, _fin_, CC10));
415 m_fsm.AddTransition(new WeaponTransition( Chamber_OD00, _abt_, OD00, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
416 m_fsm.AddTransition(new WeaponTransition( Chamber_OD00, _abt_, CC10));
417
418 m_fsm.AddTransition(new WeaponTransition( CC00, __L__, Chamber_CC00)); // chamber from closed charged
419 m_fsm.AddTransition(new WeaponTransition( Chamber_CC00, _fin_, CC10));
420 Chamber_CC00.AddTransition(new WeaponTransition( Chamber_CC00.m_start, _abt_, CC00));
421 Chamber_CC00.AddTransition(new WeaponTransition( Chamber_CC00.m_eject, _abt_, OD00));
422 Chamber_CC00.AddTransition(new WeaponTransition( Chamber_CC00.m_chamber, _abt_, OD00));
423 Chamber_CC00.AddTransition(new WeaponTransition( Chamber_CC00.m_w4t, _abt_, CC10));
424
425 // load cartridge with mag
426 m_fsm.AddTransition(new WeaponTransition( CD01, __L__, Chamber_CD01, NULL, new WeaponGuardHasMag(this))); // chamber from closed=1 with mag
427 m_fsm.AddTransition(new WeaponTransition( Chamber_CD01, _fin_, CC11));
428 Chamber_CD01.AddTransition(new WeaponTransition( Chamber_CD01.m_start, _abt_, CD01));
429 Chamber_CD01.AddTransition(new WeaponTransition( Chamber_CD01.m_eject, _abt_, OD01));
430 Chamber_CD01.AddTransition(new WeaponTransition( Chamber_CD01.m_chamber, _abt_, OD01));
431 Chamber_CD01.AddTransition(new WeaponTransition( Chamber_CD01.m_w4t, _abt_, CC11));
432
433 m_fsm.AddTransition(new WeaponTransition( CC01, __L__, Chamber_CC01, NULL, new WeaponGuardHasMag(this))); // chamber from closed=1 with mag
434 m_fsm.AddTransition(new WeaponTransition( Chamber_CC01, _fin_, CC11));
435 Chamber_CC01.AddTransition(new WeaponTransition( Chamber_CC01.m_start, _abt_, CC01));
436 Chamber_CC01.AddTransition(new WeaponTransition( Chamber_CC01.m_eject, _abt_, OD01));
437 Chamber_CC01.AddTransition(new WeaponTransition( Chamber_CC01.m_chamber, _abt_, OD01));
438 Chamber_CC01.AddTransition(new WeaponTransition( Chamber_CC01.m_w4t, _abt_, CC11));
439
440 m_fsm.AddTransition(new WeaponTransition( OD01, __L__, Chamber_OD01, NULL, new WeaponGuardHasMag(this))); // chamber from opened with mag
441 m_fsm.AddTransition(new WeaponTransition( Chamber_OD01, _fin_, CC11));
442 m_fsm.AddTransition(new WeaponTransition( Chamber_OD01, _abt_, OD01, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
443 m_fsm.AddTransition(new WeaponTransition( Chamber_OD01, _abt_, CC11));;
444
445 m_fsm.AddTransition(new WeaponTransition( CJF0, __A__, Attach_CJF0, NULL, new WeaponGuardCanAttachMag(this))); // attach from JAM/b1/m0
446 m_fsm.AddTransition(new WeaponTransition( Attach_CJF0, _fin_, CJF1));
447 //m_fsm.AddTransition(new WeaponTransition( Attach_CJF0, _abt_, CJF1, NULL, new WeaponGuardHasMag(this)));
448 //m_fsm.AddTransition(new WeaponTransition( Attach_CJF0, _abt_, CJF0));
449 Attach_CJF0.AddTransition(new WeaponTransition( Attach_CJF0.m_start, _abt_, CJF0));
450 Attach_CJF0.AddTransition(new WeaponTransition( Attach_CJF0.m_attach, _abt_, CJF0));
451
452// zdokumentovano az sem
453 // attach mag with no ammo
454 m_fsm.AddTransition(new WeaponTransition( CD00, __A__, Attach_CD00, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b0/m0
455 m_fsm.AddTransition(new WeaponTransition( Attach_CD00, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
456 m_fsm.AddTransition(new WeaponTransition( Attach_CD00, _fin_, CC11));
457 Attach_CD00.AddTransition(new WeaponTransition( Attach_CD00.m_start, _abt_, CD00));
458 Attach_CD00.AddTransition(new WeaponTransition( Attach_CD00.m_attach, _abt_, CD00));
459 Attach_CD00.AddTransition(new WeaponTransition( Attach_CD00.m_onCK, _abt_, CC01));
460 Attach_CD00.AddTransition(new WeaponTransition( Attach_CD00.m_chamber, _abt_, CC11));
461
462 m_fsm.AddTransition(new WeaponTransition( CC10, __A__, Attach_CC10, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b1/m0
463 m_fsm.AddTransition(new WeaponTransition( Attach_CC10, _fin_, CC11));
464 Attach_CC10.AddTransition(new WeaponTransition( Attach_CC10.m_start, _abt_, CC10));
465 Attach_CC10.AddTransition(new WeaponTransition( Attach_CC10.m_attach, _abt_, CC10));
466
467 m_fsm.AddTransition(new WeaponTransition( OD00, __A__, Attach_OD00, NULL, new WeaponGuardCanAttachMag(this))); // attach from OPE/b0/m0
468 m_fsm.AddTransition(new WeaponTransition( Attach_OD00, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
469 m_fsm.AddTransition(new WeaponTransition( Attach_OD00, _fin_, CC11));
470 Attach_OD00.AddTransition(new WeaponTransition( Attach_OD00.m_start, _abt_, OD00));
471 Attach_OD00.AddTransition(new WeaponTransition( Attach_OD00.m_attach, _abt_, OD00));
472 Attach_OD00.AddTransition(new WeaponTransition( Attach_OD00.m_onCK, _abt_, CC01));
473 Attach_OD00.AddTransition(new WeaponTransition( Attach_OD00.m_chamber, _abt_, CC11));
474
475 m_fsm.AddTransition(new WeaponTransition( CC00, __A__, Attach_CC00, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b0/m0 charged
476 m_fsm.AddTransition(new WeaponTransition( Attach_CC00, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
477 m_fsm.AddTransition(new WeaponTransition( Attach_CC00, _fin_, CC11));
478 Attach_CC00.AddTransition(new WeaponTransition( Attach_CC00.m_start, _abt_, CC00));
479 Attach_CC00.AddTransition(new WeaponTransition( Attach_CC00.m_attach, _abt_, CC00));
480 Attach_CC00.AddTransition(new WeaponTransition( Attach_CC00.m_onCK, _abt_, CC01));
481 Attach_CC00.AddTransition(new WeaponTransition( Attach_CC00.m_chamber, _abt_, CC11));
482
483 // replace magazine
484 m_fsm.AddTransition(new WeaponTransition( CD01, __S__, Reload_CD01, NULL, new WeaponGuardCanSwapMag(this))); // swap in CLO/b0/m1
485 m_fsm.AddTransition(new WeaponTransition( Reload_CD01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
486 m_fsm.AddTransition(new WeaponTransition( Reload_CD01, _fin_, CC11));
487 Reload_CD01.AddTransition(new WeaponTransition( Reload_CD01.m_start, _abt_, CD01));
488 Reload_CD01.AddTransition(new WeaponTransition( Reload_CD01.m_eject, _abt_, CD01));
489 Reload_CD01.AddTransition(new WeaponTransition( Reload_CD01.m_detach, _abt_, CD01));
490 Reload_CD01.AddTransition(new WeaponTransition( Reload_CD01.m_hideOld, _abt_, CD00));
491 Reload_CD01.AddTransition(new WeaponTransition( Reload_CD01.m_swapMags, _abt_, CD01));
492 Reload_CD01.AddTransition(new WeaponTransition( Reload_CD01.m_attach, _abt_, CD01));
493 Reload_CD01.AddTransition(new WeaponTransition( Reload_CD01.m_onCK, _abt_, CC01));
494 Reload_CD01.AddTransition(new WeaponTransition( Reload_CD01.m_chamber, _abt_, CC11));
495
496
497 m_fsm.AddTransition(new WeaponTransition( CC11, __S__, Reload_CC11, NULL, new WeaponGuardCanSwapMag(this))); // swap in CLO/b1/m1
498 m_fsm.AddTransition(new WeaponTransition( Reload_CC11, _fin_, CC11));
499 m_fsm.AddTransition(new WeaponTransition( Reload_CC11, _abt_, CC11, NULL, new WeaponGuardHasMag(this)));
500 m_fsm.AddTransition(new WeaponTransition( Reload_CC11, _abt_, CC10));
501
502 m_fsm.AddTransition(new WeaponTransition( CC01, __S__, Reload_CC01, NULL, new WeaponGuardCanSwapMag(this))); // CLO/b0/m1 swap with empty mag (no chamber)
503 m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
504 m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _fin_, CC11));
505 m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _abt_, CC11, NULL, new WeaponGuardCurrentChamberFull(this)) );
506 m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _abt_, CC01, NULL, new WeaponGuardHasMag(this)) );
507 m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _abt_, CC00));
508
509 m_fsm.AddTransition(new WeaponTransition( OD01, __S__, Reload_OD01, NULL, new WeaponGuardCanSwapMag(this))); // OPE/b0/m1 swap with empty mag (no chamber)
510 m_fsm.AddTransition(new WeaponTransition( Reload_OD01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
511 m_fsm.AddTransition(new WeaponTransition( Reload_OD01, _fin_, CC11));
512 Reload_OD01.AddTransition(new WeaponTransition(Reload_OD01.m_start, _abt_, OD01));
513 Reload_OD01.AddTransition(new WeaponTransition(Reload_OD01.m_eject, _abt_, OD01));
514 Reload_OD01.AddTransition(new WeaponTransition(Reload_OD01.m_detach, _abt_, OD01));
515 Reload_OD01.AddTransition(new WeaponTransition(Reload_OD01.m_hideOld, _abt_, OD00));
516 Reload_OD01.AddTransition(new WeaponTransition(Reload_OD01.m_swapMags, _abt_, OD01));
517 Reload_OD01.AddTransition(new WeaponTransition(Reload_OD01.m_attach, _abt_, OD01));
518 Reload_OD01.AddTransition(new WeaponTransition(Reload_OD01.m_onCK, _abt_, CC01));
519 Reload_OD01.AddTransition(new WeaponTransition(Reload_OD01.m_chamber, _abt_, CC11));
520
521 m_fsm.AddTransition(new WeaponTransition( CJF1, __S__, Reload_CJF1, NULL, new WeaponGuardCanSwapMag(this))); // swap in JAM/b1/m1
522 m_fsm.AddTransition(new WeaponTransition( Reload_CJF1, _fin_, CJF1));
523 m_fsm.AddTransition(new WeaponTransition( Reload_CJF1, _abt_, CC11, NULL, new WeaponGuardCurrentChamberFull(this)) );
524 m_fsm.AddTransition(new WeaponTransition( Reload_CJF1, _abt_, CC01, NULL, new WeaponGuardHasMag(this)) );
525 m_fsm.AddTransition(new WeaponTransition( Reload_CJF1, _abt_, CC00));
526
527
528 // detach magazine
529 m_fsm.AddTransition(new WeaponTransition( OD01, __D__, Detach_OD01, NULL, new WeaponGuardCanDetachMag(this))); // detach from OPE/b0/m1
530 m_fsm.AddTransition(new WeaponTransition( Detach_OD01, _fin_, OD00));
531 m_fsm.AddTransition(new WeaponTransition( Detach_OD01, _abt_, OD01, NULL, new WeaponGuardHasMag(this)));
532 m_fsm.AddTransition(new WeaponTransition( Detach_OD01, _abt_, OD00));
533
534 m_fsm.AddTransition(new WeaponTransition( CC11, __D__, Detach_CC11, NULL, new WeaponGuardCanDetachMag(this))); // detach from CLO/b1/m1
535 m_fsm.AddTransition(new WeaponTransition( Detach_CC11, _fin_, CC10));
536 m_fsm.AddTransition(new WeaponTransition( Detach_CC11, _abt_, CC11, NULL, new WeaponGuardHasMag(this)));
537 m_fsm.AddTransition(new WeaponTransition( Detach_CC11, _abt_, CC10));
538
539 m_fsm.AddTransition(new WeaponTransition( CC01, __D__, Detach_CC01, NULL, new WeaponGuardCanDetachMag(this))); // detach from CLO/b0/m1
540 m_fsm.AddTransition(new WeaponTransition( Detach_CC01, _fin_, CC00));
541 m_fsm.AddTransition(new WeaponTransition( Detach_CC01, _abt_, CC01, NULL, new WeaponGuardHasMag(this)));
542 m_fsm.AddTransition(new WeaponTransition( Detach_CC01, _abt_, CC00));
543
544 m_fsm.AddTransition(new WeaponTransition( CD01, __D__, Detach_CD01, NULL, new WeaponGuardCanDetachMag(this))); // detach from CLO/b0/m1 dischg
545 m_fsm.AddTransition(new WeaponTransition( Detach_CD01, _fin_, CD00));
546 m_fsm.AddTransition(new WeaponTransition( Detach_CD01, _abt_, CD01, NULL, new WeaponGuardHasMag(this)));
547 m_fsm.AddTransition(new WeaponTransition( Detach_CD01, _abt_, CD00));
548
549 m_fsm.AddTransition(new WeaponTransition( CJF1, __D__, Detach_CJF1, NULL, new WeaponGuardCanDetachMag(this))); // detach from CLO/b1/m1 jammed
550 m_fsm.AddTransition(new WeaponTransition( Detach_CJF1, _fin_, CJF0));
551 m_fsm.AddTransition(new WeaponTransition( Detach_CJF1, _abt_, CJF1, NULL, new WeaponGuardHasMag(this)));
552 m_fsm.AddTransition(new WeaponTransition( Detach_CJF1, _abt_, CJF0));
553
554
555 // unjam
556 m_fsm.AddTransition(new WeaponTransition( CJF0, __U__, Unjam_CJF0)); // unjam nomag
557 m_fsm.AddTransition(new WeaponTransition( Unjam_CJF0, _fin_, CJF0, NULL, new WeaponGuardJammed(this)));
558 m_fsm.AddTransition(new WeaponTransition( Unjam_CJF0, _fin_, CC00, NULL, new GuardNot(new WeaponGuardJammed(this))));
559 m_fsm.AddTransition(new WeaponTransition( Unjam_CJF0, _abt_, CJF0));
560
561 m_fsm.AddTransition(new WeaponTransition( CJF1, __U__, Unjam_CJF1)); // unjam with mag with ammo
562 m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _fin_, CJF1, NULL, new WeaponGuardJammed(this)));
563 m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
564 m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _fin_, CC11));
565 m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _abt_, CJF1, NULL, new WeaponGuardJammed(this)));
566 m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this)));
567 m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _abt_, CC11));
568
569
570 SetInitialState(CD00);
571 SelectionBulletHide();
572 HideMagazine();
573 m_fsm.Start();
574 }
575
576 override float GetChanceToJam()
577 {
578 float chanceToJam = super.GetChanceToJam();
579 Magazine mag = GetMagazine(GetCurrentMuzzle());
580
581 if(mag)
582 {
583 chanceToJam = chanceToJam + ((1.0 - chanceToJam) * mag.GetChanceToJam());
584 }
585 else
586 {
587 chanceToJam = chanceToJam + ((1.0 - chanceToJam) * 0.06);
588 }
589
590 return chanceToJam;
591 }
592
593 /*override bool GetInventoryHandAnimation(notnull InventoryLocation loc, out int value)
594 {
595 int id;
596 string name = "";
597 if ( loc.GetParent() && loc.GetParent().GetInventory().GetCurrentAttachmentSlotInfo(id,name) && name == "Hips" )
598 {
599 //value = WeaponHideShowTypes.HIDESHOW_SLOT_2HDRIGHTBACK;
600 value = WeaponHideShowTypes.HIDESHOW_SLOT_PISTOLBELT;
601 return true;
602 }
603
604 return false;
605 }*/
606
607 override void SetActions()
608 {
609 super.SetActions();
611 //AddAction(ActionAdvancedDetachMagazine);
612 }
613};
614
void wpnPrint(string s)
Definition Debug.c:1
void AddAction(typename actionName)
void WeaponGuardHasAmmo(Weapon_Base w=NULL)
Definition Guards.c:99
PistolAnimState
Definition Pistol_Base.c:3
@ CLOSED_CHARGED
closed and charged
Definition Pistol_Base.c:6
@ DEFAULT
default weapon state, closed and discharged
Definition Pistol_Base.c:4
@ OPENED_DISCHARGED
opened and discharged
Definition Pistol_Base.c:5
@ JAMMED
jammed weapon
Definition Pistol_Base.c:7
CLO_DIS_BU0_MA0
Definition Pistol_Base.c:31
CLO_CHG_BU0_MA0
Definition Pistol_Base.c:32
UNKNOWN
Definition Pistol_Base.c:30
PistolStableStateID
Definition Pistol_Base.c:13
CLO_JAM_BU1_MA0
Definition Pistol_Base.c:34
OPE_DIS_BU0_MA1
Definition Pistol_Base.c:40
CLO_CHG_BU1_MA1
Definition Pistol_Base.c:39
OPE_DIS_BU0_MA0
Definition Pistol_Base.c:35
CLO_CHG_BU1_MA0
Definition Pistol_Base.c:33
CLO_DIS_BU0_MA1
Definition Pistol_Base.c:37
CLO_JAM_BU1_MA1
Definition Pistol_Base.c:38
CLO_CHG_BU0_MA1
Definition Pistol_Base.c:36
class SSPFireout extends WeaponStableState OnEntry
enum FSMTransition WeaponTransition
MuzzleState
ref array< MuzzleState > m_muzzleHasBullet
pair ( action, actionType )
Definition Weapon_Base.c:5
static bool IsWeaponLogEnable()
Definition Debug.c:640
base for semi auto weapons @NOTE name copies config base class
ref WeaponStableState CC01
ref WeaponStableState CC00
ref WeaponStableState CC10
override float GetChanceToJam()
override void InitStateMachine()
ref WeaponStableState CD00
ref WeaponStableState CD01
ref WeaponStableState CJF0
override bool CanChamberBullet(int muzzleIndex, Magazine mag)
ref WeaponStableState CC11
void Pistol_Base()
ref WeaponStableState CJF1
ref WeaponStableState OD01
ref WeaponStableState OD00
override void SetActions()
charging of weapon without ammo to be chambered
signalize mechanism manipulation
Definition Events.c:35
weapon finite state machine
replace current magazine with new one
represents weapon's stable state (i.e. the basic states that the weapon will spend the most time in)
Definition Crossbow.c:27
override bool IsBoltOpen()
Definition Pistol_Base.c:80
override bool IsRepairEnabled()
Definition Crossbow.c:34
override void OnEntry(WeaponEventBase e)
Definition Pistol_Base.c:40
override int GetCurrentStateID()
Definition Crossbow.c:30
override void OnExit(WeaponEventBase e)
Definition Crossbow.c:29
override bool IsJammed()
Definition Crossbow.c:33
override bool HasBullet()
Definition Crossbow.c:31
override void InitMuzzleArray()
Definition Crossbow.c:35
override bool HasMagazine()
Definition Crossbow.c:32
represent weapon state base
Definition BulletHide.c:2
handle jamming state set jam/unjam state for weapon
Definition SKS.c:53
override bool IsBoltOpen()
Definition Pistol_Base.c:68
override bool IsRepairEnabled()
Definition Pistol_Base.c:69
override void OnEntry(WeaponEventBase e)
Definition Pistol_Base.c:62
override int GetCurrentStateID()
Definition Pistol_Base.c:64
override void OnExit(WeaponEventBase e)
Definition Pistol_Base.c:63
override bool IsJammed()
Definition Pistol_Base.c:67
override bool HasBullet()
Definition Pistol_Base.c:65
override void InitMuzzleArray()
Definition Pistol_Base.c:70
override bool HasMagazine()
Definition Pistol_Base.c:66
unjam submachine
WeaponActionChamberingTypes
Definition human.c:858
WeaponActions
actions
Definition human.c:798
WeaponActionReloadTypes
Definition human.c:814
WeaponActionUnjammingTypes
Definition human.c:894
WeaponActionFireTypes
Definition human.c:902