Dayz Explorer 1.28.160049
Loading...
Searching...
No Matches
openbolt_base.c
Go to the documentation of this file.
2{
3 CLOSED = 0,
4 OPENED = 1,
5 JAMMED = 2,
6};
7
9{
10 UNKNOWN = 0,
11 OB_CLO_MA0 = 1,
12 OB_OPN_MA0 = 2,
13 OB_CLO_MA1 = 3,
14 OB_OPN_MA1 = 4,
16 OB_JAM_MA0 = 6,
17 OB_JAM_MA1 = 7
18}
19
20class OB_CLO_MA0 extends WeaponStableState
21{
22 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close nomag"); } super.OnEntry(e); }
23 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close nomag"); } }
24 override int GetCurrentStateID () { return OBStableStateID.OB_CLO_MA0; }
25 override bool HasBullet () { return false; }
26 override bool HasMagazine () { return false; }
27 override bool IsJammed () { return false; }
28 override bool IsBoltOpen () { return false; }
29 override bool IsRepairEnabled () { return true; }
30 override bool IsDischarged () { return true; }
31 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
32};
33
34class OB_OPN_MA0 extends WeaponStableState
35{
36 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { open nomag"); } super.OnEntry(e); }
37 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } open nomag"); } }
38 override int GetCurrentStateID () { return OBStableStateID.OB_OPN_MA0; }
39 override bool HasBullet () { return false; }
40 override bool HasMagazine () { return false; }
41 override bool IsJammed () { return false; }
42 override bool IsBoltOpen () { return true; }
43 override bool IsRepairEnabled () { return true; }
44 override bool IsDischarged () { return false; }
45 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
46};
47
48class OB_CLO_MA1 extends WeaponStableState
49{
50 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { close mag"); } super.OnEntry(e); }
51 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } close mag"); } }
52 override int GetCurrentStateID () { return OBStableStateID.OB_CLO_MA1; }
53 override bool HasBullet () { return false; }
54 override bool HasMagazine () { return true; }
55 override bool IsJammed () { return false; }
56 override bool IsBoltOpen () { return false; }
57 override bool IsDischarged () { return true; }
58 override bool IsRepairEnabled () { return true; }
59 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
60};
61
62class OB_OPN_MA1 extends WeaponStableState
63{
64 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { open mag"); } super.OnEntry(e); }
65 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } open mag"); } }
66 override int GetCurrentStateID () { return OBStableStateID.OB_OPN_MA1; }
67 override bool HasBullet () { return true; }
68 override bool HasMagazine () { return true; }
69 override bool IsJammed () { return false; }
70 override bool IsBoltOpen () { return true; }
71 override bool IsDischarged () { return false; }
72 override bool IsRepairEnabled () { return true; }
73 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
74};
75
77{
78 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { open mag empty"); } super.OnEntry(e); }
79 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } open mag empty"); } }
80 override int GetCurrentStateID () { return OBStableStateID.OB_OPN_MA1_EMPTY; }
81 override bool HasBullet () { return false; }
82 override bool HasMagazine () { return true; }
83 override bool IsJammed () { return false; }
84 override bool IsBoltOpen () { return true; }
85 override bool IsDischarged () { return false; }
86 override bool IsRepairEnabled () { return true; }
87 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
88};
89
90class OB_JAM_MA0 extends WeaponStableState
91{
92 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { jammed nomag"); } m_weapon.SetWeaponOpen(true); super.OnEntry(e); }
93 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } jammed nomag"); } }
94 override int GetCurrentStateID () { return OBStableStateID.OB_JAM_MA0; }
95 override bool HasBullet () { return true; }
96 override bool HasMagazine () { return false; }
97 override bool IsJammed () { return true; }
98 override bool IsBoltOpen () { return true; }
99 override bool IsDischarged () { return true; }
100 override bool IsRepairEnabled () { return true; }
101 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
102};
103
104class OB_JAM_MA1 extends WeaponStableState
105{
106 override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { jammed mag"); } m_weapon.SetWeaponOpen(true); super.OnEntry(e); }
107 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } jammed mag"); } }
108 override int GetCurrentStateID () { return OBStableStateID.OB_JAM_MA1; }
109 override bool HasBullet () { return true; }
110 override bool HasMagazine () { return true; }
111 override bool IsJammed () { return true; }
112 override bool IsBoltOpen () { return true; }
113 override bool IsDischarged () { return true; }
114 override bool IsRepairEnabled () { return true; }
115 override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
116};
117
122class OpenBolt_Base extends Rifle_Base
123{
124 ref WeaponStableState C0;
125 ref WeaponStableState O0;
126 ref WeaponStableState C1;
127 ref WeaponStableState O1;
128 ref WeaponStableState O1E;
129 ref WeaponStableState J1;
130 ref WeaponStableState J0;
131
132 void OpenBolt_Base ()
133 {
134 }
135
136 override void InitStateMachine()
137 {
138 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET));
139 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));
140 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET_OPEN));
141 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET_OPEN));
142
143 m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH));
144
145 m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
146
147 m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
148 m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END));
149
150 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
151 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
152 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED));
153 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));
154
155 //m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED));
156
157 // setup state machine
158 // basic weapon states
159 // close-open-jammed | nomag-mag | - no bullet in chamber
160 // regexp: [COJ][01][-E]
161 C0 = new OB_CLO_MA0(this, NULL, OBAnimState.CLOSED);
162 O0 = new OB_OPN_MA0(this, NULL, OBAnimState.OPENED);
163 C1 = new OB_CLO_MA1(this, NULL, OBAnimState.CLOSED);
164 O1 = new OB_OPN_MA1(this, NULL, OBAnimState.OPENED);
165 O1E = new OB_OPN_MA1_EMPTY(this, NULL, OBAnimState.OPENED);
166 J0 = new OB_JAM_MA0(this, NULL, OBAnimState.JAMMED);
167 J1 = new OB_JAM_MA1(this, NULL, OBAnimState.JAMMED);
168
169 WeaponCharging Mech_C1 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
170
171 //-----------------------------------------------
172
173 WeaponStateBase Trigger_C0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
174 WeaponStateBase Trigger_C1 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
175 WeaponStateBase Trigger_O1E = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED));
176 WeaponStateBase Trigger_O0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED));
177
178 WeaponFireAndChamberNext Trigger_O1 = new WeaponFireAndChamberNext(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
179 WeaponStateBase Trigger_O1L = new WeaponFireLast(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
180 WeaponStateBase Trigger_O1J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));//Fire and jam
181
182 WeaponStateBase Trigger_J0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
183 WeaponStateBase Trigger_J1 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
184
185 //-----------------------------------------------
186
187 WeaponStateBase Unjam_J0 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
188 WeaponStateBase Unjam_J1 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
189
190 //-----------------------------------------------
191
192 WeaponAttachMagazineOpenBoltCharged Attach_C0 = new WeaponAttachMagazineOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET_OPEN));
193 WeaponAttachMagazineOpenBoltCharged Attach_O0 = new WeaponAttachMagazineOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));//TODO Need add open animation
194 WeaponAttachMagazineOpenBoltCharged Attach_J0 = new WeaponAttachMagazineOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));
195
196 WeaponReplacingMagAndChamberNextOpenBoltCharged Reload_C1 = new WeaponReplacingMagAndChamberNextOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET_OPEN));
197 WeaponReplacingMagAndChamberNextOpenBoltCharged Reload_O1 = new WeaponReplacingMagAndChamberNextOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET));//TODO Need add open animation
198 WeaponReplacingMagAndChamberNextOpenBoltCharged Reload_J1 = new WeaponReplacingMagAndChamberNextOpenBoltCharged(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET));
199
200 WeaponDetachingMagOpenBolt Detach_C1 = new WeaponDetachingMagOpenBolt(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
201 WeaponDetachingMagOpenBolt Detach_O1 = new WeaponDetachingMagOpenBolt(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
202 WeaponDetachingMagOpenBolt Detach_J1 = new WeaponDetachingMagOpenBolt(this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
203
204 //WeaponStateBase chmMag = new WeaponChamberFromAttMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
205
206 // events
207 WeaponEventBase __M__ = new WeaponEventMechanism;
208 WeaponEventBase __T__ = new WeaponEventTrigger;
209 WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
210 WeaponEventBase __U__ = new WeaponEventUnjam;
211 WeaponEventBase __A__ = new WeaponEventAttachMagazine;
212 WeaponEventBase __D__ = new WeaponEventDetachMagazine;
213 WeaponEventBase __S__ = new WeaponEventSwapMagazine;
214 WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
215 WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
216 WeaponEventBase _rto_ = new WeaponEventReloadTimeout;
217 WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
218
219 m_fsm = new WeaponFSM();
220
221 m_fsm.AddTransition(new WeaponTransition( C1, __M__, Mech_C1)); // charge from bullet nomag
222 m_fsm.AddTransition(new WeaponTransition( Mech_C1, _fin_, C1, NULL, new WeaponGuardWeaponDischarged(this) ));
223 m_fsm.AddTransition(new WeaponTransition( Mech_C1, _fin_, O1E, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
224 m_fsm.AddTransition(new WeaponTransition( Mech_C1, _fin_, O1));
225 m_fsm.AddTransition(new WeaponTransition( Mech_C1, _abt_, C1, NULL, new WeaponGuardWeaponDischarged(this) ));
226 m_fsm.AddTransition(new WeaponTransition( Mech_C1, _abt_, O1E, NULL, new WeaponGuardCurrentChamberEmpty(this) ));
227 m_fsm.AddTransition(new WeaponTransition( Mech_C1, _abt_, O1));
228
229 m_fsm.AddTransition(new WeaponTransition( C0, __M__, C0));
230 m_fsm.AddTransition(new WeaponTransition( O1E, __M__, O1E));
231 m_fsm.AddTransition(new WeaponTransition( O0, __M__, O0));
232 m_fsm.AddTransition(new WeaponTransition( O1, __M__, O1));
233 m_fsm.AddTransition(new WeaponTransition( J0, __M__, J0));
234 m_fsm.AddTransition(new WeaponTransition( J1, __M__, J1));
235
236 // fire
237 m_fsm.AddTransition(new WeaponTransition( C0, __T__, Trigger_C0));
238 m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _fin_, C0));
239 m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _dto_, C0));
240 m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _abt_, C0));
241
242 m_fsm.AddTransition(new WeaponTransition( C1, __T__, Trigger_C1));
243 m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _fin_, C1));
244 m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _dto_, C1));
245 m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _abt_, C1));
246
247 m_fsm.AddTransition(new WeaponTransition( O1, __T__, Trigger_O1, NULL, new WeaponGuardHasAmmo(this)));
248 m_fsm.AddTransition(new WeaponTransition( Trigger_O1, _fin_, O1));
249 m_fsm.AddTransition(new WeaponTransition( Trigger_O1, _rto_, O1));
250 m_fsm.AddTransition(new WeaponTransition( Trigger_O1, _abt_, O1));
251
252 m_fsm.AddTransition(new WeaponTransition( O1, __T__, Trigger_O1L, NULL, new GuardNot(new WeaponGuardHasAmmo(this))));
253 m_fsm.AddTransition(new WeaponTransition( Trigger_O1L, _fin_, O1E));
254 m_fsm.AddTransition(new WeaponTransition( Trigger_O1L, _rto_, O1E));
255 m_fsm.AddTransition(new WeaponTransition( Trigger_O1L, _abt_, O1E));
256
257 m_fsm.AddTransition(new WeaponTransition( O1, __TJ_, Trigger_O1J ));
258 m_fsm.AddTransition(new WeaponTransition( Trigger_O1J, _fin_, J1 ));
259 m_fsm.AddTransition(new WeaponTransition( Trigger_O1J, _rto_, J1 ));
260 m_fsm.AddTransition(new WeaponTransition( Trigger_O1J, _abt_, J1 ));
261
262 m_fsm.AddTransition(new WeaponTransition( O1E, __T__, Trigger_O1E));
263 m_fsm.AddTransition(new WeaponTransition( Trigger_O1E, _fin_, C1));
264 m_fsm.AddTransition(new WeaponTransition( Trigger_O1E, _rto_, C1));
265 m_fsm.AddTransition(new WeaponTransition( Trigger_O1E, _abt_, C1));
266
267 m_fsm.AddTransition(new WeaponTransition( O0, __T__, Trigger_O0));
268 m_fsm.AddTransition(new WeaponTransition( Trigger_O0, _fin_, C0));
269 m_fsm.AddTransition(new WeaponTransition( Trigger_O0, _rto_, C0));
270 m_fsm.AddTransition(new WeaponTransition( Trigger_O0, _abt_, C0));
271
272 m_fsm.AddTransition(new WeaponTransition( J0, __T__, Trigger_J0));
273 m_fsm.AddTransition(new WeaponTransition( Trigger_J0, _fin_, J0));
274 m_fsm.AddTransition(new WeaponTransition( Trigger_J0, _dto_, J0));
275 m_fsm.AddTransition(new WeaponTransition( Trigger_J0, _abt_, J0));
276
277 m_fsm.AddTransition(new WeaponTransition( J1, __T__, Trigger_J1));
278 m_fsm.AddTransition(new WeaponTransition( Trigger_J1, _fin_, J1));
279 m_fsm.AddTransition(new WeaponTransition( Trigger_J1, _dto_, J1));
280 m_fsm.AddTransition(new WeaponTransition( Trigger_J1, _abt_, J1));
281
282 // attach magazine (no mag in weapon)
283 m_fsm.AddTransition(new WeaponTransition( C0, __A__, Attach_C0, NULL, new WeaponGuardCanAttachMag(this)));
284 m_fsm.AddTransition(new WeaponTransition( Attach_C0, _fin_, C0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
285 m_fsm.AddTransition(new WeaponTransition( Attach_C0, _fin_, C1, NULL, new WeaponGuardWeaponDischarged(this)));
286 m_fsm.AddTransition(new WeaponTransition( Attach_C0, _fin_, O1E, NULL, new WeaponGuardChamberEmpty(this)) );
287 m_fsm.AddTransition(new WeaponTransition( Attach_C0, _fin_, O1));
288 m_fsm.AddTransition(new WeaponTransition( Attach_C0, _abt_, C0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
289 m_fsm.AddTransition(new WeaponTransition( Attach_C0, _abt_, C1, NULL, new WeaponGuardWeaponDischarged(this)));
290 m_fsm.AddTransition(new WeaponTransition( Attach_C0, _abt_, O1E, NULL, new WeaponGuardChamberEmpty(this)) );
291 m_fsm.AddTransition(new WeaponTransition( Attach_C0, _abt_, O1));
292
293 m_fsm.AddTransition(new WeaponTransition( O0, __A__, Attach_O0, NULL, new WeaponGuardCanAttachMag(this)));
294 m_fsm.AddTransition(new WeaponTransition( Attach_O0, _fin_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))));
295 m_fsm.AddTransition(new WeaponTransition( Attach_O0, _fin_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
296 m_fsm.AddTransition(new WeaponTransition( Attach_O0, _fin_, O1));
297 m_fsm.AddTransition(new WeaponTransition( Attach_O0, _abt_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))));
298 m_fsm.AddTransition(new WeaponTransition( Attach_O0, _abt_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
299 m_fsm.AddTransition(new WeaponTransition( Attach_O0, _abt_, O1));
300
301 m_fsm.AddTransition(new WeaponTransition( J0, __A__, Attach_J0, NULL, new WeaponGuardCanAttachMag(this)));
302 m_fsm.AddTransition(new WeaponTransition( Attach_J0, _fin_, J1, NULL, new WeaponGuardHasMag(this)));
303 m_fsm.AddTransition(new WeaponTransition( Attach_J0, _fin_, J0));
304 m_fsm.AddTransition(new WeaponTransition( Attach_J0, _abt_, J1, NULL, new WeaponGuardHasMag(this)));
305 m_fsm.AddTransition(new WeaponTransition( Attach_J0, _abt_, J0));
306
307
308 // replace magazine
309 m_fsm.AddTransition(new WeaponTransition( C1, __S__, Reload_C1, NULL, new WeaponGuardCanSwapMag(this)));
310 m_fsm.AddTransition(new WeaponTransition( Reload_C1, _fin_, C0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
311 m_fsm.AddTransition(new WeaponTransition( Reload_C1, _fin_, C1, NULL, new WeaponGuardWeaponDischarged(this)));
312 m_fsm.AddTransition(new WeaponTransition( Reload_C1, _fin_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
313 m_fsm.AddTransition(new WeaponTransition( Reload_C1, _fin_, O1));
314 m_fsm.AddTransition(new WeaponTransition( Reload_C1, _abt_, C0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
315 m_fsm.AddTransition(new WeaponTransition( Reload_C1, _abt_, C1, NULL, new WeaponGuardWeaponDischarged(this)));
316 m_fsm.AddTransition(new WeaponTransition( Reload_C1, _abt_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
317 m_fsm.AddTransition(new WeaponTransition( Reload_C1, _abt_, O1));
318
319 m_fsm.AddTransition(new WeaponTransition( O1, __S__, Reload_O1, NULL, new WeaponGuardCanSwapMag(this)));
320 m_fsm.AddTransition(new WeaponTransition( O1E, __S__, Reload_O1, NULL, new WeaponGuardCanSwapMag(this)));
321 m_fsm.AddTransition(new WeaponTransition( Reload_O1, _fin_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
322 m_fsm.AddTransition(new WeaponTransition( Reload_O1, _fin_, O1E, NULL, new WeaponGuardChamberEmpty(this)) );
323 m_fsm.AddTransition(new WeaponTransition( Reload_O1, _fin_, O1));
324 m_fsm.AddTransition(new WeaponTransition( Reload_O1, _abt_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))) );
325 m_fsm.AddTransition(new WeaponTransition( Reload_O1, _abt_, O1E, NULL, new WeaponGuardChamberEmpty(this)) );
326 m_fsm.AddTransition(new WeaponTransition( Reload_O1, _abt_, O1));
327
328 m_fsm.AddTransition(new WeaponTransition( J1, __S__, Reload_J1, NULL, new WeaponGuardCanSwapMag(this)));
329 m_fsm.AddTransition(new WeaponTransition( Reload_J1, _fin_, J1, NULL, new WeaponGuardHasMag(this)));
330 m_fsm.AddTransition(new WeaponTransition( Reload_J1, _fin_, J0));
331 m_fsm.AddTransition(new WeaponTransition( Reload_J1, _abt_, J1, NULL, new WeaponGuardHasMag(this)));
332 m_fsm.AddTransition(new WeaponTransition( Reload_J1, _abt_, J0));
333
334 // @TODO: abort in jam
335
336 // detach magazine
337 m_fsm.AddTransition(new WeaponTransition( C1, __D__, Detach_C1, NULL, new WeaponGuardCanDetachMag(this)));
338 m_fsm.AddTransition(new WeaponTransition( Detach_C1, _fin_, C1, NULL, new WeaponGuardHasMag(this)));
339 m_fsm.AddTransition(new WeaponTransition( Detach_C1, _fin_, C0));
340 m_fsm.AddTransition(new WeaponTransition( Detach_C1, _abt_, C1, NULL, new WeaponGuardHasMag(this)));
341 m_fsm.AddTransition(new WeaponTransition( Detach_C1, _abt_, C0));
342
343 m_fsm.AddTransition(new WeaponTransition( O1E, __D__, Detach_O1, NULL, new WeaponGuardCanDetachMag(this)));
344 m_fsm.AddTransition(new WeaponTransition( O1, __D__, Detach_O1, NULL, new WeaponGuardCanDetachMag(this)));
345 m_fsm.AddTransition(new WeaponTransition( Detach_O1, _fin_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))));
346 m_fsm.AddTransition(new WeaponTransition( Detach_O1, _fin_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
347 m_fsm.AddTransition(new WeaponTransition( Detach_O1, _fin_, O1));
348 m_fsm.AddTransition(new WeaponTransition( Detach_O1, _abt_, O0, NULL, new GuardNot(new WeaponGuardHasMag(this))));
349 m_fsm.AddTransition(new WeaponTransition( Detach_O1, _abt_, O1E, NULL, new WeaponGuardChamberEmpty(this)));
350 m_fsm.AddTransition(new WeaponTransition( Detach_O1, _abt_, O1));
351
352 m_fsm.AddTransition(new WeaponTransition( J1, __D__, Detach_J1, NULL, new WeaponGuardCanDetachMag(this)));
353 m_fsm.AddTransition(new WeaponTransition( Detach_J1, _fin_, J1, NULL, new WeaponGuardHasMag(this)));
354 m_fsm.AddTransition(new WeaponTransition( Detach_J1, _fin_, J0));
355 m_fsm.AddTransition(new WeaponTransition( Detach_J1, _abt_, J1, NULL, new WeaponGuardHasMag(this)));
356 m_fsm.AddTransition(new WeaponTransition( Detach_J1, _abt_, J0));
357
358
359 // unjam
360 m_fsm.AddTransition(new WeaponTransition( J0, __U__, Unjam_J0)); // unjam nomag
361 m_fsm.AddTransition(new WeaponTransition( Unjam_J0, _fin_, J0, NULL, new WeaponGuardJammed(this)));
362 m_fsm.AddTransition(new WeaponTransition( Unjam_J0, _fin_, O0));
363 m_fsm.AddTransition(new WeaponTransition( Unjam_J0, _abt_, J0, NULL, new WeaponGuardJammed(this)));
364 m_fsm.AddTransition(new WeaponTransition( Unjam_J0, _abt_, O0));
365
366 m_fsm.AddTransition(new WeaponTransition( J1, __U__, Unjam_J1)); // unjam with mag with ammo
367 m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _fin_, J1, NULL, new WeaponGuardJammed(this)));
368 m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _fin_, O1E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
369 m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _fin_, O1));
370 m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _abt_, J1, NULL, new WeaponGuardJammed(this)));
371 m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _abt_, O1E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
372 m_fsm.AddTransition(new WeaponTransition( Unjam_J1, _abt_, O1));
373
374 SetInitialState(C0);
375
376 SelectionBulletHide();
377 HideMagazine();
378
379 m_fsm.Start();
380 }
381
382 override void SetActions()
383 {
384 super.SetActions();
385
388 }
389
390}
void wpnPrint(string s)
Definition debug.c:1
void RemoveAction(typename actionName)
void SetActions()
pair ( action, actionType )
Definition weapon_base.c:5
base for automatic weapons fireing from open bolt position @NOTE name copies config base class
Definition pm73rak.c:6
base for rifles @NOTE name copies config base class
Definition sks.c:70
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 for weapon charged with open position bolt
represents weapon's stable state (i.e. the basic states that the weapon will spend the most time in)
Definition crossbow.c:27
represent weapon state base
Definition bullethide.c:2
unjam submachine
override bool IsRepairEnabled()
Definition crossbow.c:23
override bool IsJammed()
Definition crossbow.c:22
override bool HasBullet()
Definition crossbow.c:20
override void InitMuzzleArray()
Definition crossbow.c:24
override bool HasMagazine()
Definition crossbow.c:21
FirearmActionLoadBullet FirearmActionBase FirearmActionLoadBulletQuick()
class WeaponGuardIsDestroyed extends WeaponGuardBase m_weapon
Definition guards.c:604
void WeaponGuardHasAmmo(Weapon_Base w=NULL)
Definition guards.c:99
void WeaponGuardWeaponDischarged(Weapon_Base w=NULL)
Definition guards.c:580
override int GetCurrentStateID()
Definition hand_states.c:29
OB_OPN_MA1
OB_JAM_MA0
OBStableStateID
OB_OPN_MA0
OB_JAM_MA1
OB_CLO_MA1
override bool IsBoltOpen()
OBAnimState
@ OPENED
@ CLOSED
default weapon state, closed and discharged
@ JAMMED
UNKNOWN
OB_CLO_MA0
OB_OPN_MA1_EMPTY
class SSPFireout extends WeaponStableState OnEntry
enum FSMTransition WeaponTransition
class WeaponChambering_Chamber_OnEntry extends WeaponChambering_Base OnExit
MuzzleState
ref array< MuzzleState > m_muzzleHasBullet
bool IsDischarged()
Whether the gun is discharged.