Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_CharacterCommandHandler_Tests.c
Go to the documentation of this file.
1[ComponentEditorProps(category: "GameScripted/Character", description: "Scripted character command handler FOR TESTING", icon: HYBRID_COMPONENT_ICON)]
5
6class SCR_CharacterCommandHandlerComponent_Tests : SCR_CharacterCommandHandlerComponent
7{
8 //------------------------------------------------------------------------------------------------
9 override bool HandleDeath(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
10 {
11 if ( pCurrentCommandID == ECharacterCommandIDs.DEATH )
12 {
13 if ( pCurrentCommandFinished )
15
16 return true;
17 }
18
19 float die = pInputCtx.GetDie();
20 if ( die != 0.0 )
21 {
22 GetCommandModifier_Death().StartDeath();
23
24 return true;
25 }
26
27 return false;
28 }
29
30 //------------------------------------------------------------------------------------------------
31 override bool HandleFinishedCommands(bool pCurrentCommandFinished)
32 {
33 if( pCurrentCommandFinished )
34 {
35 // start falling ? (can happen after climbing)
36 if( m_CharacterAnimComp.PhysicsIsFalling() )
37 {
38 StartCommand_Fall(0);
39 vector charTM[4];
40 m_OwnerEntity.GetTransform(charTM);
41 m_fFallYDiff = charTM[3][1];
42 return true;
43 }
44
46 m_WeaponManager.SetVisibleCurrentWeapon(true);
48 StartCommand_Move();
49 return true;
50 }
51
52 return false;
53 }
54
55 //------------------------------------------------------------------------------------------------
56 override bool HandleSwimming(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
57 {
59 vector charTM[4];
60 m_OwnerEntity.GetTransform(charTM);
61 vector pp = charTM[3];
62 float waterDepth = pInputCtx.GetWaterBodyApproxDepth();
63 float waterCharSubmersion = pInputCtx.GetWaterCharacterSubmersion();
64
65 CharacterCommandSwimSettings swimSettings = GetCommandSwimSettings();
66 if( pCurrentCommandID == ECharacterCommandIDs.SWIM )
67 {
68 if( waterDepth < swimSettings.m_fWaterLevelOut )
69 {
70 CharacterCommandSwim sc = GetCommandSwim();
71 sc.StopSwimming();
72 return true;
73 }
74
75 return true;
76 }
77
79 if( waterDepth >= swimSettings.m_fWaterLevelIn && waterCharSubmersion >= swimSettings.m_fWaterLevelIn )
80 {
81 m_WeaponManager.SetVisibleCurrentWeapon(false);
82 StartCommand_Swim();
83 return true;
84 }
85
87 if( pCurrentCommandID == ECharacterCommandIDs.MOVE )
88 {
89 CharacterCommandMove mc = GetCommandMove();
90
91 if( waterCharSubmersion > swimSettings.m_fToErectLevel )
92 {
93 m_CharacterControllerComp.ForceStanceUp(0);
94 }
95 else if( waterCharSubmersion > swimSettings.m_fToCrouchLevel )
96 {
97 m_CharacterControllerComp.ForceStanceUp(1);
98 }
99 }
100
101 return false;
102 }
103
104 //------------------------------------------------------------------------------------------------
105 override bool HandleLadders(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
106 {
108 if (m_MovementState.m_iStanceIdx != CharacterStance.STANCE_ERECT)
109 return false;
110
112 if (m_MovementState.m_fMovement > 2)
113 return false;
114
115 if (pCurrentCommandID == ECharacterCommandIDs.LADDER )
116 return true;
117
118 vector charTM[4];
119 m_OwnerEntity.GetTransform(charTM);
120
121 vector mins = "-0.5 -0.5 -0.5";
122 vector maxs = "0.5 2.0 0.5";
123 autoptr TraceBox trace = new TraceBox;
124 trace.Exclude = m_OwnerEntity;
125 trace.LayerMask = EPhysicsLayerDefs.Ladder;
126 trace.Flags = TraceFlags.ENTS | TraceFlags.WORLD;
127 trace.Start = charTM[3];
128 trace.Mins = mins;
129 trace.Maxs = maxs;
130
131 if (m_OwnerEntity.GetWorld().TracePosition(trace, null) < 0)
132 {
133 if (!trace.TraceEnt)
134 return false;
135
136 GenericEntity ge = GenericEntity.Cast(trace.TraceEnt);
137 if (!ge)
138 return false;
139
141 if (ladder)
142 {
143 vector ladderTM[4];
144 ge.GetTransform(ladderTM);
145
146 if (ladder.IsAbove(charTM[3]))
147 ladderTM[2] = ladderTM[2] * -1;
148
149 float cosFi = vector.Dot(charTM[2], ladderTM[2]);
150 vector cross = charTM[2] * ladderTM[2];
151 float dirAngle = Math.Acos(cosFi) * Math.RAD2DEG;
152
153 if( cross[1] < 0 )
154 dirAngle = -dirAngle;
155
156 float movementSpeed;
157 vector movementDir;
158
160 pInputCtx.GetMovement(movementSpeed, movementDir);
161
163 if(((dirAngle <= 30 && dirAngle >= -30) || Math.AbsFloat(dirAngle) == 90) && movementDir[2] > 0)
164 {
165 m_WeaponManager.SetVisibleCurrentWeapon(false);
166 StartCommand_Ladder(ladder);
167 return true;
168 }
169 }
170 }
171
172 return false;
173 }
174
175 //------------------------------------------------------------------------------------------------
176 override bool HandleClimbing(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
177 {
178 if( pCurrentCommandID == ECharacterCommandIDs.CLIMB )
179 return true;
180
181 return false;
182 }
183
184 //------------------------------------------------------------------------------------------------
185 override bool HandleFalling(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
186 {
187 if ( pCurrentCommandID == ECharacterCommandIDs.FALL )
188 {
189 vector charTM[4];
190 int landType = ELandType.LANDTYPE_NONE;
191
192 CharacterCommandFall fallCmd = GetCommandFall();
193
194 if( fallCmd && fallCmd.PhysicsLanded() )
195 {
196 m_OwnerEntity.GetTransform(charTM);
197 m_fFallYDiff = m_fFallYDiff - charTM[3][1];
198
199 float fFallYDiff = Math.AbsFloat(m_fFallYDiff);
200 if( fFallYDiff < 0.5 )
201 landType = ELandType.LANDTYPE_NONE;
202 else if( fFallYDiff < 1.0 )
203 landType = ELandType.LANDTYPE_LIGHT;
204 else if( fFallYDiff < 2.0 )
205 landType = ELandType.LANDTYPE_MEDIUM;
206 else
207 landType = ELandType.LANDTYPE_HEAVY;
208
209 fallCmd.Land(landType, m_fFallYDiff);
210 }
211
212 return true;
213 }
214
215 if ( m_CharacterAnimComp && m_CharacterAnimComp.PhysicsIsFalling() )
216 {
217 StartCommand_Fall(0);
218
219 vector charTM[4];
220 m_OwnerEntity.GetTransform(charTM);
221 m_fFallYDiff = charTM[3][1];
222
223 return true;
224 }
225
226 return false;
227 }
228
229 /*
230 //------------------------------------------------------------------------------------------------
231 override bool HandleDamageHit(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
232 {
233 if( m_iDamageHitAnimType != -1 )
234 {
235 if( m_bHitLight )
236 AddCommandModifier_Damage(m_iDamageHitAnimType, m_fHitDirection);
237
238 m_iDamageHitAnimType = -1;
239 }
240
241 return false; // return true in case of full body damage
242 }
243 */
244
245 /*
246 //------------------------------------------------------------------------------------------------
247 override bool HandleWeapons(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
248 {
249 if( !m_CommandWeapons )
250 return false;
251
252 if( HandleWeaponChange(pInputCtx, pDt, pCurrentCommandID) )
253 return true;
254
255 if( HandleWeaponObstructionDefault(pInputCtx, pDt, pCurrentCommandID) )
256 return true;
257
258 return false;
259 }
260
261 //------------------------------------------------------------------------------------------------
262 override bool HandleWeaponChange(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
263 {
264 switch( m_CommandWeapons.GetWeaponChangeState() )
265 {
266 case EWeaponChangeState.WEAPON_CHANGE_NONE:
267 {
268 if( pInputCtx.IsWeaponChange() )
269 {
270 m_CommandWeapons.SetWeaponChangeState(EWeaponChangeState.WEAPON_CHANGE_HIDE);
271 m_pWeaponManager.GetCurrentWeapon().SetSafetyFireMode(true);
272 if( m_pWeaponManager.IsWeaponItemAttached() )
273 {
274 m_CommandWeapons.StartWeaponHide(0);
275 }
276 return true;
277 }
278 }
279 break;
280 case EWeaponChangeState.WEAPON_CHANGE_HIDE:
281 {
282 if( !m_CommandWeapons.IsChangingWeaponHideTag() || !m_pWeaponManager.IsWeaponItemAttached() )
283 {
284 m_CommandWeapons.SetWeaponChangeState(EWeaponChangeState.WEAPON_CHANGE_SWITCH);
285 auto weapon = m_pWeaponManager.FindWeapon(pInputCtx.GetWantedWeaponIdx());
286 if( m_CharacterControllerComp.TakeWeaponInHands(weapon) )
287 {
288 m_pAnimationComponent.TrackPoseUpdate();
289 }
290 }
291 return true;
292 }
293 break;
294 case EWeaponChangeState.WEAPON_CHANGE_SWITCH:
295 {
296 // Wait for pose to be updated before start showing weapon
297 // otherwise IK pose will be broken when showing weapon
298 if( m_pAnimationComponent.DidPoseUpdated() )
299 {
300 if( m_pWeaponManager.IsWeaponItemAttached() )
301 {
302 m_CommandWeapons.StartWeaponShow(0);
303 m_CommandWeapons.SetWeaponChangeState(EWeaponChangeState.WEAPON_CHANGE_SHOW);
304 }
305 else
306 {
307 m_CommandWeapons.SetWeaponChangeState(EWeaponChangeState.WEAPON_CHANGE_EMPTY);
308 }
309 }
310 return true;
311 }
312 break;
313 case EWeaponChangeState.WEAPON_CHANGE_SHOW:
314 {
315 if( !m_CommandWeapons.IsChangingWeaponTag() )
316 {
317 m_pAnimationComponent.RefreshIkPose();
318 m_CommandWeapons.SetWeaponChangeState(EWeaponChangeState.WEAPON_CHANGE_NONE);
319 m_pWeaponManager.GetCurrentWeapon().SetSafetyFireMode(false);
320 return false;
321 }
322 return true;
323 }
324 break;
325 case EWeaponChangeState.WEAPON_CHANGE_CANCEL:
326 {
327 m_CommandWeapons.StartWeaponShow(0);
328 m_pAnimationComponent.RefreshIkPose();
329 m_CommandWeapons.SetWeaponChangeState(EWeaponChangeState.WEAPON_CHANGE_NONE);
330 m_pWeaponManager.GetCurrentWeapon().SetSafetyFireMode(false);
331 return true;
332 }
333 break;
334 case EWeaponChangeState.WEAPON_CHANGE_EMPTY:
335 {
336 if( m_pWeaponManager.IsWeaponItemAttached() )
337 {
338 m_CommandWeapons.StartWeaponShow(0);
339 m_CommandWeapons.SetWeaponChangeState(EWeaponChangeState.WEAPON_CHANGE_SHOW);
340 }
341 }
342 break;
343 default:
344 break;
345 }
346 return false;
347 }
348
349 //------------------------------------------------------------------------------------------------
350 override bool HandleThrowing(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
351 {
352 // canceling action
353 if( pInputCtx.IsThrowCanceled() && (m_ThrowingState > EThrowingState.THROWING_NONE && m_ThrowingState < EThrowingState.THROWING_THROW) )
354 {
355 m_ThrowingState = EThrowingState.THROWING_CANCEL_ENTER;
356 }
357
358 switch( m_ThrowingState )
359 {
360 case EThrowingState.THROWING_NONE:
361 if( pInputCtx.GetThrow() && m_WeaponManager.IsCurrentWeaponThrowable() )
362 {
363 m_ThrowingState = EThrowingState.THROWING_UNPIN_ACTION;
364 m_CommandWeapons.StartPinGrenadeAction(0);
365 // TODO: uncomment when exposed
366 //m_WeaponManager.OnAnimationEvent("Weapon_Unpin", nullptr, -1);
367 return true;
368 }
369 break;
370
371 case EThrowingState.THROWING_UNPIN_ACTION:
372 if( !m_CommandWeapons.IsGrenadeAttachmentAnimTag() )
373 {
374 m_fThrowingForce = pDt;
375 m_ThrowingState = EThrowingState.THROWING_SETFORCE;
376 }
377 return true;
378
379 case EThrowingState.THROWING_SETFORCE:
380 {
381 if( !pInputCtx.GetThrow() )
382 {
383 m_ThrowingState = EThrowingState.THROWING_THROW;
384 m_CommandWeapons.StartThrowingAction();
385 return true;
386 }
387
388 m_fThrowingForce += pDt;
389 }
390 return true;
391
392 case EThrowingState.THROWING_THROW:
393 if( m_CommandWeapons.WasItemLeaveHandsEvent() )
394 {
396 float lrAngle = m_CommandWeapons.GetAimAngleLR();
397 float udAngle = m_CommandWeapons.GetAimAngleUD();
398
400 float ya = Math.DEG2RAD * lrAngle;
401 float pa = Math.DEG2RAD * udAngle;
402 float cp = Math.Cos(0);
403
404 //enf::Vector3 dirMS{ cp * sinf(ya), sin(pa), cp * cosf(ya) };
405 vector dirMS = Vector(cp * Math.Sin(ya), Math.Sin(pa), cp * Math.Cos(ya));
406 //enf::Vector3 dirWS = m_pOwner->GetWorldTransform().TransformVector(dirMS.Normalized());
407 vector dirWS = m_OwnerEntity.VectorToParent(dirMS.Normalized());
408
409 m_WeaponManager.Throw(m_OwnerEntity, true, dirWS, m_fThrowingForce);
410 m_ThrowingState = EThrowingState.THROWING_FINISH;
411 }
412 return true;
413
414 case EThrowingState.THROWING_FINISH:
415 if( m_CommandWeapons.IsThrowTag() )
416 return true;
417 m_fThrowingForce = 0.0;
418 m_ThrowingState = EThrowingState.THROWING_NONE;
419 break;
420
421 case EThrowingState.THROWING_CANCEL_ENTER:
422 if( !m_CommandWeapons.IsGrenadeAttachmentAnimTag() )
423 {
424 m_CommandWeapons.StartPinGrenadeAction(1);
425 m_WeaponManager.OnAnimationEvent("Weapon_Repin", nullptr, -1);
426 m_fThrowingForce = 0.0;
427 m_ThrowingState = EThrowingState.THROWING_CANCEL_EXIT;
428 }
429 return true;
430
431 case EThrowingState.THROWING_CANCEL_EXIT:
432 if( !m_CommandWeapons.IsGrenadeAttachmentAnimTag() )
433 {
434 m_ThrowingState = EThrowingState.THROWING_NONE;
435 }
436 break;
437 }
438
439 return false;
440 }
441 */
442
443 //------------------------------------------------------------------------------------------------
445 {
446 if ( pInputCtx.GetJump() > 0.0 )
447 {
448 CancelThrowDefault();
449
451 CharacterCommandClimb.DoClimbTest(m_OwnerEntity, GetCommandClimbSettings(), climbTestResult);
452
453 vector grabPoint = climbTestResult.m_ClimbGrabPointLS;
454 if ( climbTestResult.m_ClimbParent )
455 {
456 vector grabParentTM[4];
457 climbTestResult.m_ClimbParent.GetWorldTransform(grabParentTM);
458 grabPoint = grabPoint.Multiply4(grabParentTM);
459 }
460
461 vector charTM[4];
462 m_OwnerEntity.GetWorldTransform(charTM);
463 const float climbHeight = grabPoint[1] - charTM[3][1];
464
465 int climbType = -1;
466 if ( climbTestResult.m_bIsClimb || climbTestResult.m_bIsClimbOver )
467 {
468 if ( climbHeight < 1.1 )
469 climbType = 0;
470 else if( climbHeight >= 1.1 && climbHeight < 1.7 )
471 climbType = 1;
472 else if( climbHeight >= 1.7 && climbHeight < 2.5 )
473 climbType = 2;
474
475 if ( climbType != -1 )
476 {
477 StartCommand_Climb(climbTestResult, climbType);
478 }
479 }
480
481 if ( climbType == -1 )
482 {
483 m_fFallYDiff = charTM[3][1];
484 StartCommand_Fall(pInputCtx.GetJump());
485 }
486 return true;
487 }
488
489 return false;
490 }
491
492 //------------------------------------------------------------------------------------------------
493 override protected void OnInit(IEntity owner)
494 {
495 super.OnInit(owner);
496
500 }
501
502 /*
503 //------------------------------------------------------------------------------------------------
504 override bool SubhandlerStatesBegin(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
505 {
506 if( pCurrentCommandID == ECommandIDs.SCRIPTED )
507 {
508 AnimPhysCommandScripted cmd = m_CharacterAnimComp.GetCommandScripted();
509
510 if( SCR_CharacterCommandFly.Cast(cmd) )
511 return true;
512
513 }
514
515 if ( pInputCtx.GetJump() > 0.0 )
516 {
517 m_CharacterAnimComp.SetCurrentCommand(m_FlyCommand);
518 return true;
519 }
520
521 return false;
522 }
523 */
524
528
529 protected float m_fFallYDiff;
530 //protected float m_fThrowingForce;
531
532 //protected CharacterCommandWeapon m_CommandWeapons;
533 //protected EThrowingState m_ThrowingState;
534}
ECharacterCommandIDs
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
SCR_AIUtilityComponentClass m_OwnerEntity
BaseWeaponManagerComponent m_WeaponManager
CharacterAnimationComponent m_CharacterAnimComp
SCR_CharacterControllerComponent m_CharacterControllerComp
ref CharacterMovementState m_MovementState
override bool HandleFalling(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
ref SCR_CharacterCommandSwim m_SwimCommand
override bool TransitionMove_JumpClimb(CharacterInputContext pInputCtx)
override bool HandleLadders(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
override bool HandleFinishedCommands(bool pCurrentCommandFinished)
override bool HandleClimbing(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
override bool HandleSwimming(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID)
ref SCR_CharacterCommandFly m_FlyCommand
ref SCR_CharacterCommandSwimST m_SwimST
SCR_CharacterCommandHandlerComponent_TestsClass SCR_CharacterCommandHandlerComponentClass HandleDeath(CharacterInputContext pInputCtx, float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
void SCR_CharacterCommandSwimST(CharacterAnimationComponent pAnimationComponent)
class SCR_CharacterCommandSwimST SCR_CharacterCommandSwim(BaseAnimPhysComponent pAnimPhysComponent, SCR_CharacterCommandSwimST pTable, ChimeraCharacter pCharacter, CharacterControllerComponent pController)
CharacterCommandMove.
CharacterCommandSwim - swimming implementation.
proto external Managed FindComponent(typename typeName)
proto external void GetTransform(out vector mat[])
Definition Math.c:13
HYBRID_COMPONENT_ICON
Default icon for all components written in script that don't inherit ScriptComponent.
BaseCommandHandlerComponentClass GameComponentClass SetSimulationDisabled(bool pSimulationDisabled)
ELandType
Definition ELandType.c:14
TraceFlags
Definition TraceFlags.c:13