DayZ 1.27
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 (GetGame().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 super.ShowBullet(muzzleIndex);
303
304 Magnum_Cylinder cylinder = Magnum_Cylinder.Cast(GetAttachmentByType(Magnum_Cylinder));
305 if (cylinder)
306 {
307 string bullet = "bullet";
308 if (muzzleIndex > 0)
309 bullet = string.Format("bullet_" + (muzzleIndex + 1));
310
311 cylinder.ShowSelection(bullet);
312
313 if (!IsChamberFiredOut(muzzleIndex))
314 {
315 string bullet_nose = "bullet_nose";
316 if (muzzleIndex > 0)
317 bullet_nose = string.Format("bullet_nose_" + (muzzleIndex + 1));
318 cylinder.ShowSelection(bullet_nose);
319 }
320 }
321 }
322
323 override void HideBullet(int muzzleIndex)
324 {
325 super.HideBullet(muzzleIndex);
326
327 Magnum_Cylinder cylinder = Magnum_Cylinder.Cast(GetAttachmentByType(Magnum_Cylinder));
328 if (cylinder)
329 {
330 string bullet = "bullet";
331 if (muzzleIndex > 0)
332 bullet = string.Format("bullet_" + (muzzleIndex + 1));
333
334 cylinder.HideSelection(bullet);
335
336 string bullet_nose = "bullet_nose";
337 if (muzzleIndex > 0)
338 bullet_nose = string.Format("bullet_nose_" + (muzzleIndex + 1));
339 cylinder.HideSelection(bullet_nose);
340 }
341 }
342
343 //Debug menu Spawn Ground Special
344 override void OnDebugSpawn()
345 {
346 super.OnDebugSpawn();
347
348 EntityAI entity;
349 if ( Class.CastTo(entity, this) )
350 {
351 entity.SpawnEntityOnGroundPos("Ammo_357", entity.GetPosition());
352 }
353 }
354};
355
356class Magnum extends Magnum_Base
357{
358 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
359 {
360 super.GetDebugActions(outputList);
361
362 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.LIGHT_GREY));
363 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SPIN, "Spin", FadeColors.LIGHT_GREY));
364 }
365
366 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
367 {
368 if (GetGame().IsServer())
369 {
370 if (action_id == EActions.SPIN)
371 {
372 const float animPhaseOffset = 0.167;
373
374 Magnum_Cylinder cylinder = Magnum_Cylinder.Cast(GetAttachmentByType(Magnum_Cylinder));
375 Magnum_Ejector ejector = Magnum_Ejector.Cast(GetAttachmentByType(Magnum_Ejector));
376
377 if (cylinder)
378 {
379 float animPhase = cylinder.GetAnimationPhase("Rotate_Cylinder");
380 if (animPhase + animPhaseOffset > 1.0)
381 {
382 animPhase -= 1.0;
383 cylinder.ResetAnimationPhase("Rotate_Cylinder", animPhase);
384 ejector.ResetAnimationPhase("Rotate_Ejector", animPhase);
385 }
386
387 cylinder.SetAnimationPhase("Rotate_Cylinder", animPhase);
388 ejector.ResetAnimationPhase("Rotate_Ejector", animPhase);
389 }
390 }
391 }
392
393 return super.OnAction(action_id, player, ctx);
394 }
395}
396
397class SawedoffMagnum extends Magnum_Base {};
398class Magnum_Cylinder extends DummyItem {};
399class Magnum_Ejector extends DummyItem {};
Param4< int, int, string, int > TSelectableActionInfoWithColor
Определения EntityAI.c:97
void wpnPrint(string s)
Определения Debug.c:1
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
@ UNKNOWN
24 - Any other error. Can be returned from any call.
Определения BIOSErrorModule.c:56
EActions
Определения EActions.c:2
@ DEFAULT
Определения ECrewMemberState.c:3
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
bool IsSingleState()
Special one for when the weapon only has one singular state (like Magnum)
Определения WeaponStableState.c:140
bool IsChamberFiredOut(int idx)
Определения WeaponStableState.c:153
bool IsChamberFull(int idx)
Определения WeaponStableState.c:154
pair ( action, actionType )
Определения Weapon_Base.c:5
Super root of all classes in Enforce script.
Определения EnScript.c:11
Определения Magnum.c:398
Определения Building.c:6
Определения InventoryItem.c:731
static bool IsWeaponLogEnable()
Определения Debug.c:718
Определения Debug.c:594
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения Magnum.c:366
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения Magnum.c:358
Определения Magnum.c:357
Определения 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:323
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:344
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
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 OnExit(WeaponEventBase e)
Определения Crossbow.c:29
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
proto native CGame GetGame()
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
Определения constants.c:452
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:920