Dayz Explorer 1.29.162510
Loading...
Searching...
No Matches
weapondetachingmag.c
Go to the documentation of this file.
1
2// detach magazine composite state
3class WeaponDetachingMag_1 extends WeaponStartAction
4{ };
5
6class WeaponDetachingMag_Store extends WeaponStateBase
7{
8 Magazine m_magazine;
9 ref InventoryLocation m_dst;
10
11 override void OnEntry (WeaponEventBase e)
12 {
13 //if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store, Detaching mag=" + m_magazine.ToString() + "to loc=" + InventoryLocation.DumpToStringNullSafe(m_dst)); }
14 super.OnEntry(e);
15 if (e)
16 {
17 if (!m_magazine || !m_dst)
18 {
19 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store, error - no magazine to load from (m_magazine=NULL)");
20 }
21 }
22 }
23
24 override void OnAbort (WeaponEventBase e)
25 {
26 m_magazine = NULL;
27 m_dst = NULL;
28
29 super.OnAbort(e);
30 }
31
32 override void OnExit (WeaponEventBase e)
33 {
34 InventoryLocation il = new InventoryLocation;
35 if (m_magazine.GetInventory().GetCurrentInventoryLocation(il))
36 {
37 if (GameInventory.LocationSyncMoveEntity(il, m_dst))
38 {
39 m_weapon.HideMagazine();
40 if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store, ok - magazine removed from inv (inv->dst)"); }
41 }
42 else
43 {
44 // @TODO: drop on gnd
45 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store, error - cannot store detached magazine!");
46 }
47 }
48 else
49 {
50 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store, error - cannot get curr location");
51 }
52
53 m_magazine = NULL;
54 m_dst = NULL;
55 super.OnExit(e);
56 }
57
58 override bool SaveCurrentFSMState (ParamsWriteContext ctx)
59 {
60 if (!super.SaveCurrentFSMState(ctx))
61 return false;
62
63 if (!ctx.Write(m_magazine))
64 {
65 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store.SaveCurrentFSMState: cannot write m_magazine for weapon=" + m_weapon);
66 return false;
67 }
68
70 {
71 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store.SaveCurrentFSMState: cannot write m_st for weapon=" + m_weapon);
72 return false;
73 }
74 return true;
75 }
76
77 override bool LoadCurrentFSMState (ParamsReadContext ctx, int version)
78 {
79 if (!super.LoadCurrentFSMState(ctx, version))
80 return false;
81
82 if (!ctx.Read(m_magazine))
83 {
84 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store.LoadCurrentFSMState: cannot read m_magazine for weapon=" + m_weapon);
85 return false;
86 }
88 {
89 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store.LoadCurrentFSMState: cannot read m_dst for weapon=" + m_weapon);
90 return false;
91 }
92 return true;
93 }
94};
95
96class WeaponDetachingMag_StoreRemoveChamberBullet extends WeaponStateBase
97{
98 Magazine m_magazine;
99 ref InventoryLocation m_dst;
100 bool m_bulletEjected;
101
102 override void OnEntry (WeaponEventBase e)
103 {
104 //if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store, Detaching mag=" + m_magazine.ToString() + "to loc=" + InventoryLocation.DumpToStringNullSafe(m_dst)); }
105 super.OnEntry(e);
106 m_bulletEjected = false;
107 if (e)
108 {
109 if (!m_magazine || !m_dst)
110 {
111 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store, error - no magazine to load from (m_magazine=NULL)");
112 }
113 else
114 {
115 int mi = m_weapon.GetCurrentMuzzle();
116 if(!m_weapon.IsChamberFiredOut(mi))
117 {
118 if(!m_weapon.IsChamberEmpty(mi))
119 {
120 m_bulletEjected = true;
121 DayZPlayer p = e.m_player;
123 m_weapon.EffectBulletHide(mi);
124 m_weapon.HideBullet(mi);
125 }
126 }
127 }
128 }
129 }
130
131 override void OnAbort (WeaponEventBase e)
132 {
133 if(m_bulletEjected)
134 {
135 int mi = m_weapon.GetCurrentMuzzle();
137
138 m_weapon.EffectBulletHide(0);
139 m_weapon.HideBullet(0);
140 }
141
142 m_magazine = NULL;
143 m_dst = NULL;
144
145 super.OnAbort(e);
146 }
147
148 override void OnExit (WeaponEventBase e)
149 {
150 InventoryLocation il = new InventoryLocation;
151 if (m_magazine.GetInventory().GetCurrentInventoryLocation(il))
152 {
153 if (GameInventory.LocationSyncMoveEntity(il, m_dst))
154 {
155 m_weapon.HideMagazine();
156 if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store, ok - magazine removed from inv (inv->dst)"); }
157 }
158 else
159 {
160 // @TODO: drop on gnd
161 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store, error - cannot store detached magazine!");
162 }
163 }
164 else
165 {
166 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store, error - cannot get curr location");
167 }
168
169 m_magazine = NULL;
170 m_dst = NULL;
171 super.OnExit(e);
172 }
173
174 override bool SaveCurrentFSMState (ParamsWriteContext ctx)
175 {
176 if (!super.SaveCurrentFSMState(ctx))
177 return false;
178
179 if (!ctx.Write(m_magazine))
180 {
181 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store.SaveCurrentFSMState: cannot write m_magazine for weapon=" + m_weapon);
182 return false;
183 }
184
186 {
187 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store.SaveCurrentFSMState: cannot write m_st for weapon=" + m_weapon);
188 return false;
189 }
190 return true;
191 }
192
193 override bool LoadCurrentFSMState (ParamsReadContext ctx, int version)
194 {
195 if (!super.LoadCurrentFSMState(ctx, version))
196 return false;
197
198 if (!ctx.Read(m_magazine))
199 {
200 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store.LoadCurrentFSMState: cannot read m_magazine for weapon=" + m_weapon);
201 return false;
202 }
204 {
205 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag_Store.LoadCurrentFSMState: cannot read m_dst for weapon=" + m_weapon);
206 return false;
207 }
208 return true;
209 }
210};
211
212/*class WeaponDetachingMag_Store_W4T extends WeaponDetachingMag_Store
213{
214 override bool IsWaitingForActionFinish () { return true; }
215};*/
216
217class WeaponDetachingMag extends WeaponStateBase
218{
219 WeaponActions m_action;
220 int m_actionType;
221 Magazine m_magazine;
222 ref InventoryLocation m_dst;
223
224 ref WeaponStateBase m_start;
225 ref WeaponDetachingMag_Store m_store;
226 ref MagazineHide_W4T m_hideM;
227
228 void WeaponDetachingMag (Weapon_Base w = NULL, WeaponStateBase parent = NULL, WeaponActions action = WeaponActions.NONE, int actionType = -1)
229 {
230 m_action = action;
231 m_actionType = actionType;
232
233 // setup nested state machine
234 m_start = new WeaponDetachingMag_1(m_weapon, this, m_action, m_actionType);
235 m_store = new WeaponDetachingMag_Store(m_weapon, this);
236 m_hideM = new MagazineHide_W4T(m_weapon, this);
237 // events
238 WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
239 WeaponEventBase __md_ = new WeaponEventAnimMagazineDetached;
240 WeaponEventBase __mh_ = new WeaponEventAnimMagazineHide;
241
242 m_fsm = new WeaponFSM(this); // @NOTE: set owner of the submachine fsm
243 m_fsm.AddTransition(new WeaponTransition(m_start, __md_, m_store));
244 m_fsm.AddTransition(new WeaponTransition(m_store, __mh_, m_hideM));
245 m_fsm.AddTransition(new WeaponTransition(m_hideM, _fin_, NULL));
246
247 // Safety exits
248 m_fsm.AddTransition(new WeaponTransition(m_store , _fin_, null));
249 m_fsm.AddTransition(new WeaponTransition(m_start , _fin_, null));
250
251 m_fsm.SetInitialState(m_start);
252 }
253
254 override void OnEntry (WeaponEventBase e)
255 {
256 if (e != NULL)
257 {
258 WeaponEventDetachMagazine de;
259 if (Class.CastTo(de, e))
260 {
261 if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("WeaponDetachingMag type=" + typename.EnumToString(InventoryLocationType, de.m_dst.GetType())); }
262 m_magazine = e.m_magazine;
263 m_dst = de.m_dst;
264
265 m_store.m_magazine = m_magazine;
266 m_store.m_dst = m_dst;
267 if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("WeaponDetachingMag type=" + typename.EnumToString(InventoryLocationType, m_store.m_dst.GetType())); }
268 }
269 }
270 super.OnEntry(e); // @NOTE: super at the end (prevent override from submachine start)
271 }
272
273 override void OnExit (WeaponEventBase e)
274 {
275 m_dst = NULL;
276 m_magazine = NULL;
277 super.OnExit(e);
278 }
279
280 override bool SaveCurrentFSMState (ParamsWriteContext ctx)
281 {
282 if (!super.SaveCurrentFSMState(ctx))
283 return false;
284
285 if (!ctx.Write(m_magazine))
286 {
287 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag.SaveCurrentFSMState: cannot write m_magazine for weapon=" + m_weapon);
288 return false;
289 }
290
292 {
293 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag.SaveCurrentFSMState: cannot write m_st for weapon=" + m_weapon);
294 return false;
295 }
296 return true;
297 }
298
299 override bool LoadCurrentFSMState (ParamsReadContext ctx, int version)
300 {
301 if (!super.LoadCurrentFSMState(ctx, version))
302 return false;
303
304 if (!ctx.Read(m_magazine))
305 {
306 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag.LoadCurrentFSMState: cannot read m_magazine for weapon=" + m_weapon);
307 return false;
308 }
310 {
311 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMag.LoadCurrentFSMState: cannot read m_dst for weapon=" + m_weapon);
312 return false;
313 }
314 return true;
315 }
316};
317
318class WeaponDetachingMagOpenBolt extends WeaponStateBase
319{
320 WeaponActions m_action;
321 int m_actionType;
322 Magazine m_magazine;
323 ref InventoryLocation m_dst;
324
325 ref WeaponStateBase m_start;
326 ref WeaponDetachingMag_StoreRemoveChamberBullet m_store;
327 ref MagazineHide_W4T m_hideM;
328
329 void WeaponDetachingMagOpenBolt (Weapon_Base w = NULL, WeaponStateBase parent = NULL, WeaponActions action = WeaponActions.NONE, int actionType = -1)
330 {
331 m_action = action;
332 m_actionType = actionType;
333
334 // setup nested state machine
335 m_start = new WeaponDetachingMag_1(m_weapon, this, m_action, m_actionType);
336 m_store = new WeaponDetachingMag_StoreRemoveChamberBullet(m_weapon, this);
337 m_hideM = new MagazineHide_W4T(m_weapon, this);
338 // events
339 WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
340 WeaponEventBase __md_ = new WeaponEventAnimMagazineDetached;
341 WeaponEventBase __mh_ = new WeaponEventAnimMagazineHide;
342
343 m_fsm = new WeaponFSM(this); // @NOTE: set owner of the submachine fsm
344 m_fsm.AddTransition(new WeaponTransition(m_start, __md_, m_store));
345 m_fsm.AddTransition(new WeaponTransition(m_store, __mh_, m_hideM));
346 m_fsm.AddTransition(new WeaponTransition(m_hideM, _fin_, NULL));
347
348 // Safety exits
349 m_fsm.AddTransition(new WeaponTransition(m_store , _fin_, null));
350 m_fsm.AddTransition(new WeaponTransition(m_start , _fin_, null));
351
352 m_fsm.SetInitialState(m_start);
353 }
354
355 override void OnEntry (WeaponEventBase e)
356 {
357 if (e != NULL)
358 {
359 WeaponEventDetachMagazine de;
360 if (Class.CastTo(de, e))
361 {
362 if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("WeaponDetachingMagOpenBolt type=" + typename.EnumToString(InventoryLocationType, de.m_dst.GetType())); }
363 m_magazine = e.m_magazine;
364 m_dst = de.m_dst;
365
366 m_store.m_magazine = m_magazine;
367 m_store.m_dst = m_dst;
368 if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("WeaponDetachingMagOpenBolt type=" + typename.EnumToString(InventoryLocationType, m_store.m_dst.GetType())); }
369 }
370 }
371 super.OnEntry(e); // @NOTE: super at the end (prevent override from submachine start)
372 }
373
374 override void OnExit (WeaponEventBase e)
375 {
376 m_dst = NULL;
377 m_magazine = NULL;
378 super.OnExit(e);
379 }
380
381 override bool SaveCurrentFSMState (ParamsWriteContext ctx)
382 {
383 if (!super.SaveCurrentFSMState(ctx))
384 return false;
385
386 if (!ctx.Write(m_magazine))
387 {
388 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMagOpenBolt.SaveCurrentFSMState: cannot write m_magazine for weapon=" + m_weapon);
389 return false;
390 }
391
393 {
394 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMagOpenBolt.SaveCurrentFSMState: cannot write m_st for weapon=" + m_weapon);
395 return false;
396 }
397 return true;
398 }
399
400 override bool LoadCurrentFSMState (ParamsReadContext ctx, int version)
401 {
402 if (!super.LoadCurrentFSMState(ctx, version))
403 return false;
404
405 if (!ctx.Read(m_magazine))
406 {
407 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMagOpenBolt.LoadCurrentFSMState: cannot read m_magazine for weapon=" + m_weapon);
408 return false;
409 }
411 {
412 Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponDetachingMagOpenBolt.LoadCurrentFSMState: cannot read m_dst for weapon=" + m_weapon);
413 return false;
414 }
415 return true;
416 }
417};
418
void wpnDebugPrint(string s)
Definition debug.c:9
simple class starting animation action specified by m_action and m_actionType
represent weapon state base
Definition bullethide.c:2
ref InventoryLocation m_dst
Serializer ParamsReadContext
Definition gameplay.c:15
class LOD Object
Serializer ParamsWriteContext
Definition gameplay.c:16
void Error(string err)
Messagebox with error message.
Definition endebug.c:90
class WeaponGuardIsDestroyed extends WeaponGuardBase m_weapon
Definition guards.c:604
HandStateEquipped OnEntry
bool OptionalLocationReadFromContext(out InventoryLocation loc, notnull ParamsReadContext ctx)
InventoryLocationType
types of Inventory Location
bool OptionalLocationWriteToContext(InventoryLocation loc, notnull ParamsWriteContext ctx)
override void OnAbort()
enum FSMTransition WeaponTransition
enum FSMTransition WeaponEventBase
void ejectBulletAndStoreInMagazine(Weapon_Base weapon, int muzzleIndex, Magazine mag, DayZPlayer p)
bool pushToChamberFromAttachedMagazine(Weapon_Base weapon, int muzzleIndex)
Definition weapon_utils.c:1
ref WeaponStateBase m_start
class WeaponChambering_Chamber_OnEntry extends WeaponChambering_Base OnExit
class WeaponEndAction extends WeaponStartAction m_action
override bool LoadCurrentFSMState(ParamsReadContext ctx, int version)
override bool SaveCurrentFSMState(ParamsWriteContext ctx)