DayZ 1.29
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
Magnum.c
См. документацию.
1const float MAGNUM_ROTATION_POSITION_M1 = -0.167;
2const float MAGNUM_ROTATION_POSITION_0 = 0.0;
3const float MAGNUM_ROTATION_POSITION_1 = 0.167;
4const float MAGNUM_ROTATION_POSITION_2 = 0.334;
5const float MAGNUM_ROTATION_POSITION_3 = 0.500;
6const float MAGNUM_ROTATION_POSITION_4 = 0.668;
7const float MAGNUM_ROTATION_POSITION_5 = 0.835;
8const float MAGNUM_ROTATION_POSITION_6 = 1.0;
9
10
12{
13 DEFAULT = 0,
14};
15
17{
19 DEFAULT = 1,
20}
21
22class Magnum_Static_State extends WeaponStableState
23{
24 bool init = false;
25 override void OnEntry(WeaponEventBase e)
26 {
27 if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { Magnum stable state"); }
28 super.OnEntry(e);
29 if (init)
30 {
31 Magnum_Base magnum;
32 if (CastTo(magnum, m_weapon))
33 {
34 magnum.SyncCylinderRotation();
35 //magnum.SyncSelectionStateFromState();
36 }
37 }
38 init = true;
39 }
40 override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } Magnum stable state"); } }
41 override int GetCurrentStateID () { return MagnumStableStateID.DEFAULT; }
42 override bool HasBullet() { return m_weapon.IsChamberFull(m_weapon.GetCurrentMuzzle()); }
43 override bool HasMagazine() { return false; }
44 override bool IsJammed() { return m_weapon.IsJammed(); }
45 override bool IsSingleState() { return true; }
46};
47
48
49
50class Magnum_Base extends Weapon_Base
51{
55 const string ATT_SLOT_CYLINDER = "RevolverCylinder";
56 const string ATT_SLOT_EJECTOR = "RevolverEjector";
57
58 override void SetActions()
59 {
61 super.SetActions();
63 }
64
66 {
67 return new MagnumRecoil(this);
68 }
69
71 {
74
75 /*m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionTypes.CHAMBERING_STARTLOOPABLE_CLOSED));
76 m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionTypes.CHAMBERING_ENDLOOPABLE));
77 m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionTypes.MECHANISM_CLOSED));
78 m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionTypes.MECHANISM_SPECIAL));
79 m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionTypes.UNJAMMING_START));
80 m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionTypes.UNJAMMING_END));
81 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionTypes.FIRE_NORMAL));
82 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionTypes.FIRE_COCKED));*/
83 }
84
85 override void InitStateMachine ()
86 {
87 m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_CLOSED));
88 m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_CLOSED_KEEP));
89 m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE));
90 m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
91 m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_SPECIAL));
92 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
93 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED));
94 m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED));
95
96
97 // setup state machine
98 // basic weapon state
99 C = new Magnum_Static_State(this, NULL, MagnumAnimState.DEFAULT);
100
101
102 WeaponMagnumChambering Chamber = new WeaponMagnumChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_CLOSED_KEEP,WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
103 WeaponMagnumChambering Chamber_E = new WeaponMagnumChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_CLOSED,WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
104 //WeaponMagnumChambering Chamber_CC00 = new WeaponMagnumChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_END);
105
106 WeaponCharging Mech = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
107
108 WeaponStateBase Trigger_normal = new WeaponFireMagnum(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
109 WeaponStateBase Trigger_dry = new WeaponFireMagnum(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED);
110
111 // events
112
113 WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
114 WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
115 WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
116 WeaponEventBase __M__ = new WeaponEventMechanism;
117 WeaponEventBase __T__ = new WeaponEventTrigger;
118
119
120 WeaponEventBase _rto_ = new WeaponEventReloadTimeout;
121 WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
122
123
124 m_fsm = new WeaponFSM();
125
126
127
128 m_fsm.AddTransition(new WeaponTransition( C, __L__, Chamber, null, new WeaponGuardAnyChamberFiredOut(this))); // chamber from closed charged
129 m_fsm.AddTransition(new WeaponTransition( Chamber, _fin_, C));
130 m_fsm.AddTransition(new WeaponTransition( Chamber, _abt_, C));
131
132
133 m_fsm.AddTransition(new WeaponTransition( C, __L__, Chamber_E)); // chamber from closed charged
134 m_fsm.AddTransition(new WeaponTransition( Chamber_E, _fin_, C));
135 m_fsm.AddTransition(new WeaponTransition( Chamber_E, _abt_, C));
136
137
138 m_fsm.AddTransition(new WeaponTransition( C, __M__, Mech)); // charge from closed
139 m_fsm.AddTransition(new WeaponTransition( Mech, _fin_, C));
140 m_fsm.AddTransition(new WeaponTransition( Mech, _abt_, C));
141
142
143
144 m_fsm.AddTransition(new WeaponTransition( C, __T__, Trigger_normal, null, new GuardAnd (new WeaponGuardCurrentChamberFull(this), new GuardNot(new WeaponGuardCurrentChamberFiredOut(this))) )); // fire.cocked
145 m_fsm.AddTransition(new WeaponTransition( Trigger_normal, _fin_, C));
146 m_fsm.AddTransition(new WeaponTransition( Trigger_normal, _dto_, C));
147 m_fsm.AddTransition(new WeaponTransition( Trigger_normal, _abt_, C));
148
149 m_fsm.AddTransition(new WeaponTransition( C, __T__, Trigger_dry)); // fire.cocked
150 m_fsm.AddTransition(new WeaponTransition( Trigger_dry, _fin_, C));
151 m_fsm.AddTransition(new WeaponTransition( Trigger_dry, _dto_, C));
152 m_fsm.AddTransition(new WeaponTransition( Trigger_dry, _abt_, C));
153
154
155 SetInitialState(C);
156 SelectionBulletHide();
157 SetCurrentMuzzle(0);
158 //HideMagazine();
159 m_fsm.Start();
160 }
161
162 override bool CanChamberBullet(int muzzleIndex, Magazine mag)
163 {
164 if ( CanChamberFromMag(muzzleIndex, mag) )
165 {
166 if (IsChamberEmpty(muzzleIndex))
167 return true;
168
169 if (IsChamberFiredOut(muzzleIndex))
170 return true;
171 }
172 return false;
173 }
174
175 override void AssembleGun()
176 {
177 super.AssembleGun();
178
179 if ( !FindAttachmentBySlotName(ATT_SLOT_EJECTOR) )
180 {
181 GetInventory().CreateAttachment("Magnum_Ejector");
182 }
183
184 if ( !FindAttachmentBySlotName(ATT_SLOT_CYLINDER) )
185 {
186 GetInventory().CreateAttachment("Magnum_Cylinder");
187 }
188
189 ForceSyncSelectionState();
191 }
192
193 static float GetCylinderRotation(int muzzleIndex)
194 {
195 switch (muzzleIndex)
196 {
197 case 0:
199 case 1:
201 case 2:
203 case 3:
205 case 4:
207 case 5:
209 }
210
211 ErrorEx(string.Format("Invalid muzzle index: %1", muzzleIndex));
212
214 }
215
216 void SetCylinderRotationAnimationPhase(float rot, bool reset = false)
217 {
218 Magnum_Cylinder cylinder = Magnum_Cylinder.Cast(GetAttachmentByType(Magnum_Cylinder));
219 Magnum_Ejector ejector = Magnum_Ejector.Cast(GetAttachmentByType(Magnum_Ejector));
220 if (cylinder && ejector)
221 {
222 float anim_phase = cylinder.GetAnimationPhase("Rotate_Cylinder");
223 if ( Math.AbsFloat(anim_phase - rot) > 0.1 )
224 {
225 if (reset)
226 {
227 cylinder.ResetAnimationPhase("Rotate_Cylinder", rot );
228 ejector.ResetAnimationPhase("Rotate_Ejector", rot );
229 }
230 else if (rot == MAGNUM_ROTATION_POSITION_0)
231 {
232 cylinder.ResetAnimationPhase("Rotate_Cylinder", MAGNUM_ROTATION_POSITION_M1 );
233 ejector.ResetAnimationPhase("Rotate_Ejector", MAGNUM_ROTATION_POSITION_M1 );
234 }
235
236 cylinder.SetAnimationPhase("Rotate_Cylinder", rot );
237 ejector.SetAnimationPhase("Rotate_Ejector", rot );
238 }
239 }
240 }
241
242 void SyncCylinderRotation(bool reset = true)
243 {
244 SetCylinderRotationAnimationPhase(GetCylinderRotation(GetCurrentMuzzle()), reset);
245 }
246
247 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
248 {
249 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
250
251 if (g_Game.IsClient())
252 return;
253
255 }
256
257 //sets health of cylinder and ejector objects
259 {
260 EntityAI entity;
261 ItemBase attachment;
262 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
263 {
264 entity = GetInventory().GetAttachmentFromIndex(i);
265 if ( Class.CastTo(attachment,entity) )
266 {
267 attachment.SetHealth01("","Health",GetHealth01());
268 }
269 }
270 }
271
272 override void OnFire(int muzzle_index)
273 {
274 super.OnFire(muzzle_index);
275 Magnum_Cylinder cylinder = Magnum_Cylinder.Cast(GetAttachmentByType(Magnum_Cylinder));
276 if (cylinder)
277 {
278 string bullet_nose = "bullet_nose";
279 if (muzzle_index > 0)
280 bullet_nose = string.Format("bullet_nose_" + (muzzle_index + 1));
281 cylinder.HideSelection(bullet_nose);
282 }
283 }
284
286 {
287 return false;
288 }
289
290 override bool CanEjectBullet()
291 {
292 for (int i = 0; i < GetMuzzleCount(); i++)
293 {
294 if (IsChamberFull(i))
295 return true;
296 }
297 return false;
298 }
299
300 override void ShowBullet(int muzzleIndex)
301 {
302 Magnum_Cylinder cylinder = Magnum_Cylinder.Cast(GetAttachmentByType(Magnum_Cylinder));
303 if (cylinder)
304 {
305 string bullet = "bullet";
306 if (muzzleIndex > 0)
307 bullet = string.Format("bullet_" + (muzzleIndex + 1));
308
309 cylinder.ShowSelection(bullet);
310
311 if (!IsChamberFiredOut(muzzleIndex))
312 {
313 string bullet_nose = "bullet_nose";
314 if (muzzleIndex > 0)
315 bullet_nose = string.Format("bullet_nose_" + (muzzleIndex + 1));
316 cylinder.ShowSelection(bullet_nose);
317 }
318 }
319 }
320
321 override void HideBullet(int muzzleIndex)
322 {
323 super.HideBullet(muzzleIndex);
324
325 Magnum_Cylinder cylinder = Magnum_Cylinder.Cast(GetAttachmentByType(Magnum_Cylinder));
326 if (cylinder)
327 {
328 string bullet = "bullet";
329 if (muzzleIndex > 0)
330 bullet = string.Format("bullet_" + (muzzleIndex + 1));
331
332 cylinder.HideSelection(bullet);
333
334 string bullet_nose = "bullet_nose";
335 if (muzzleIndex > 0)
336 bullet_nose = string.Format("bullet_nose_" + (muzzleIndex + 1));
337 cylinder.HideSelection(bullet_nose);
338 }
339 }
340
341 //Debug menu Spawn Ground Special
342 override void OnDebugSpawn()
343 {
344 super.OnDebugSpawn();
345
346 EntityAI entity;
347 if ( Class.CastTo(entity, this) )
348 {
349 entity.SpawnEntityOnGroundPos("Ammo_357", entity.GetPosition());
350 }
351 }
352};
353
354class Magnum extends Magnum_Base
355{
356 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
357 {
358 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.LIGHT_GREY));
359 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SPIN, "Spin", FadeColors.LIGHT_GREY));
360 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
361
362 super.GetDebugActions(outputList);
363 }
364
365 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
366 {
367 if (g_Game.IsServer())
368 {
369 if (action_id == EActions.SPIN)
370 {
371 const float animPhaseOffset = 0.167;
372
373 Magnum_Cylinder cylinder = Magnum_Cylinder.Cast(GetAttachmentByType(Magnum_Cylinder));
374 Magnum_Ejector ejector = Magnum_Ejector.Cast(GetAttachmentByType(Magnum_Ejector));
375
376 if (cylinder)
377 {
378 float animPhase = cylinder.GetAnimationPhase("Rotate_Cylinder");
379 if (animPhase + animPhaseOffset > 1.0)
380 {
381 animPhase -= 1.0;
382 cylinder.ResetAnimationPhase("Rotate_Cylinder", animPhase);
383 ejector.ResetAnimationPhase("Rotate_Ejector", animPhase);
384 }
385
386 cylinder.SetAnimationPhase("Rotate_Cylinder", animPhase);
387 ejector.ResetAnimationPhase("Rotate_Ejector", animPhase);
388 }
389 }
390 }
391
392 return super.OnAction(action_id, player, ctx);
393 }
394}
395
396class SawedoffMagnum extends Magnum_Base {};
397class Magnum_Cylinder extends DummyItem {};
398class Magnum_Ejector extends DummyItem {};
Param4< int, int, string, int > TSelectableActionInfoWithColor
void wpnPrint(string s)
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
@ UNKNOWN
24 - Any other error. Can be returned from any call.
Определения BIOSErrorModule.c:56
DayZGame g_Game
Определения DayZGame.c:3942
EActions
Определения EActions.c:2
class WeaponGuardIsDestroyed extends WeaponGuardBase m_weapon
Определения Guards.c:604
enum MagnumStableStateID init
const float MAGNUM_ROTATION_POSITION_2
Определения Magnum.c:4
const float MAGNUM_ROTATION_POSITION_1
Определения Magnum.c:3
const float MAGNUM_ROTATION_POSITION_3
Определения Magnum.c:5
const float MAGNUM_ROTATION_POSITION_4
Определения Magnum.c:6
const float MAGNUM_ROTATION_POSITION_6
Определения Magnum.c:8
MagnumStableStateID
Определения Magnum.c:17
MagnumAnimState
Определения Magnum.c:12
const float MAGNUM_ROTATION_POSITION_M1
Определения Magnum.c:1
const float MAGNUM_ROTATION_POSITION_5
Определения Magnum.c:7
const float MAGNUM_ROTATION_POSITION_0
Определения Magnum.c:2
class SSPFireout extends WeaponStableState OnEntry
enum FSMTransition WeaponTransition
class WeaponChambering_Chamber_OnEntry extends WeaponChambering_Base OnExit
Определения WeaponChambering.c:352
bool IsSingleState()
Special one for when the weapon only has one singular state (like Magnum)
Определения WeaponStableState.c:144
bool IsChamberFiredOut(int idx)
Определения WeaponStableState.c:157
bool IsChamberFull(int idx)
Определения WeaponStableState.c:158
pair ( action, actionType )
Определения Weapon_Base.c:5
Super root of all classes in Enforce script.
Определения EnScript.c:11
Определения Magnum.c:397
static bool IsWeaponLogEnable()
Определения 3_Game/DayZ/tools/Debug.c:816
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения Magnum.c:365
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения Magnum.c:356
Определения Magnum.c:355
Определения MagnumRecoil.c:2
Определения EnMath.c:7
Определения RecoilBase.c:2
int m_LastMuzzleloaded
Определения Magnum.c:53
override void InitStateMachine()
Определения Magnum.c:85
const string ATT_SLOT_EJECTOR
Определения Magnum.c:56
override void HideBullet(int muzzleIndex)
Определения Magnum.c:321
ref WeaponStableState C
Определения Magnum.c:52
override RecoilBase SpawnRecoilObject()
Определения Magnum.c:65
override bool IsShowingChamberedBullet()
Определения Magnum.c:285
override void ShowBullet(int muzzleIndex)
Определения Magnum.c:300
override void AssembleGun()
Определения Magnum.c:175
int m_ActiveMuzzle
Определения Magnum.c:54
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения Magnum.c:247
override void SetActions()
Определения Magnum.c:58
void SyncCylinderRotation(bool reset=true)
Определения Magnum.c:242
override bool CanEjectBullet()
Определения Magnum.c:290
static float GetCylinderRotation(int muzzleIndex)
Определения Magnum.c:193
override bool CanChamberBullet(int muzzleIndex, Magazine mag)
Определения Magnum.c:162
override void OnFire(int muzzle_index)
Определения Magnum.c:272
const string ATT_SLOT_CYLINDER
Определения Magnum.c:55
override void OnDebugSpawn()
Определения Magnum.c:342
void SetCylinderRotationAnimationPhase(float rot, bool reset=false)
Определения Magnum.c:216
void Magnum_Base()
Определения Magnum.c:70
void SetAttachmentsHealth()
Определения Magnum.c:258
shorthand
Определения BoltActionRifle_Base.c:6
override void OnExit(WeaponEventBase e)
Определения WeaponChambering.c:439
charging of weapon without ammo to be chambered
signalize mechanism manipulation
Определения Events.c:35
weapon finite state machine
override bool IsJammed()
Определения Crossbow.c:33
override void OnEntry(WeaponEventBase e)
Определения Crossbow.c:28
override bool HasBullet()
Определения Crossbow.c:31
override int GetCurrentStateID()
Определения Crossbow.c:30
override bool HasMagazine()
Определения Crossbow.c:32
represents weapon's stable state (i.e. the basic states that the weapon will spend the most time in)
Определения Crossbow.c:27
represent weapon state base
Определения BulletHide.c:2
Serializer ParamsReadContext
Определения gameplay.c:15
@ DEFAULT
Определения DebugTextFlags.c:9
enum ShapeType ErrorEx
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
static proto float AbsFloat(float f)
Returns absolute value.
const int SAT_DEBUG_ACTION
Определения 3_Game/DayZ/constants.c:457
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.
WeaponActionChamberingTypes
Определения human.c:876
WeaponActions
actions
Определения human.c:816
WeaponActionFireTypes
Определения human.c:926