DayZ 1.28
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
WeaponDetachingMag.c
См. документацию.
1
2// detach magazine composite state
3class WeaponDetachingMag_1 extends WeaponStartAction
4{ };
5
6class WeaponDetachingMag_Store extends WeaponStateBase
7{
8 Magazine m_magazine;
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 {
35 if (m_magazine.GetInventory().GetCurrentInventoryLocation(il))
36 {
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
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;
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 {
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 {
151 if (m_magazine.GetInventory().GetCurrentInventoryLocation(il))
152 {
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
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{
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())); }
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
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{
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())); }
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
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)
ref InventoryLocation m_dst
Определения DayZPlayerInventory.c:13
bool OptionalLocationReadFromContext(out InventoryLocation loc, notnull ParamsReadContext ctx)
Определения InventoryLocation.c:662
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
bool OptionalLocationWriteToContext(InventoryLocation loc, notnull ParamsWriteContext ctx)
Определения InventoryLocation.c:640
enum FSMTransition WeaponTransition
ref WeaponStateBase m_start
Определения WeaponChambering.c:807
class WeaponEndAction extends WeaponStartAction m_action
Super root of all classes in Enforce script.
Определения EnScript.c:11
static proto native bool LocationSyncMoveEntity(notnull InventoryLocation src_loc, notnull InventoryLocation dst_loc)
synchronously removes item from current inventory location and adds it to destination no anims involv...
script counterpart to engine's class Inventory
InventoryLocation.
Определения InventoryLocation.c:29
static bool IsWeaponLogEnable()
Определения 3_Game/tools/Debug.c:718
Определения 3_Game/tools/Debug.c:594
Определения ObjectTyped.c:2
proto bool Write(void value_out)
proto bool Read(void value_in)
shorthand
Определения BoltActionRifle_Base.c:6
Magazine m_magazine
Определения Events.c:38
DayZPlayer m_player
Определения Events.c:37
signalize mechanism manipulation
Определения Events.c:35
weapon finite state machine
simple class starting animation action specified by m_action and m_actionType
Определения WeaponChambering.c:3
int m_actionType
action to be played
Определения RifleChambering.c:4
void WeaponStateBase(Weapon_Base w=NULL, WeaponStateBase parent=NULL)
internal state id used for load/restore
Определения WeaponStateBase.c:17
ref WeaponDetachingMag_Store m_store
Определения WeaponDetachingMag.c:225
void WeaponDetachingMag(Weapon_Base w=NULL, WeaponStateBase parent=NULL, WeaponActions action=WeaponActions.NONE, int actionType=-1)
Определения WeaponDetachingMag.c:228
ref WeaponFSM m_fsm
hierarchical parent state of this state (or null)
Определения WeaponStateBase.c:14
bool m_bulletEjected
Определения WeaponDetachingMag.c:100
WeaponActions m_action
Определения RifleChambering.c:3
Weapon_Base m_weapon
Определения WeaponStateBase.c:12
Magazine m_magazine
Определения WeaponDetachingMag.c:8
override void OnEntry(WeaponEventBase e)
Определения WeaponDetachingMag.c:11
ref WeaponStateBase m_start
source of the cartridge
Определения RifleChambering.c:7
void WeaponDetachingMagOpenBolt(Weapon_Base w=NULL, WeaponStateBase parent=NULL, WeaponActions action=WeaponActions.NONE, int actionType=-1)
Определения WeaponDetachingMag.c:329
override bool LoadCurrentFSMState(ParamsReadContext ctx, int version)
Определения WeaponDetachingMag.c:77
ref InventoryLocation m_dst
magazine that will be detached
Определения WeaponDetachingMag.c:9
override void OnAbort(WeaponEventBase e)
Определения WeaponDetachingMag.c:24
ref MagazineHide_W4T m_hideM
Определения WeaponDetachingMag.c:226
override void OnExit(WeaponEventBase e)
Определения WeaponDetachingMag.c:32
override bool SaveCurrentFSMState(ParamsWriteContext ctx)
Определения WeaponDetachingMag.c:58
represent weapon state base
Определения BulletHide.c:2
Serializer ParamsReadContext
Определения gameplay.c:15
Serializer ParamsWriteContext
Определения gameplay.c:16
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
WeaponActions
actions
Определения human.c:816
void ejectBulletAndStoreInMagazine(Weapon_Base weapon, int muzzleIndex, Magazine mag, DayZPlayer p)
Определения weapon_utils.c:58
bool pushToChamberFromAttachedMagazine(Weapon_Base weapon, int muzzleIndex)
Определения weapon_utils.c:1