handanimatedmovingtoatt.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. class HandStartHidingAnimated extends HandStartAction
  2. {
  3. void HandStartHidingAnimated(Man player = null, HandStateBase parent = null, WeaponActions action = WeaponActions.NONE, int actionType = -1)
  4. { }
  5. override void OnEntry(HandEventBase e)
  6. {
  7. super.OnEntry(e);
  8. }
  9. override void OnAbort(HandEventBase e)
  10. {
  11. super.OnAbort(e);
  12. }
  13. override void OnExit(HandEventBase e)
  14. {
  15. super.OnExit(e);
  16. }
  17. override bool IsWaitingForActionFinish() { return m_ActionType == -1; }
  18. };
  19. // When editing this, take a look at HandAnimatedMoveToDst_W4T_Basic as well
  20. // They can not be inherited from each other because of different inheritance
  21. class HandAnimatedMoveToDst_W4T extends HandStartAction
  22. {
  23. ref InventoryLocation m_Dst;
  24. override void OnEntry(HandEventBase e)
  25. {
  26. if (m_Dst && m_Dst.IsValid())
  27. {
  28. EntityAI item = m_Dst.GetItem();
  29. InventoryLocation src = new InventoryLocation;
  30. if (item.GetInventory().GetCurrentInventoryLocation(src))
  31. {
  32. if (!GetGame().IsDedicatedServer())
  33. {
  34. if (!GetGame().IsMultiplayer())
  35. {
  36. m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst.GetItem(), m_Dst);
  37. GameInventory.LocationSyncMoveEntity(src, m_Dst);
  38. m_Player.OnItemInHandsChanged();
  39. }
  40. else
  41. {
  42. m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst.GetItem(), m_Dst);
  43. m_Player.GetHumanInventory().PostDeferredEventTakeToDst(InventoryMode.JUNCTURE,src, m_Dst);
  44. }
  45. }
  46. else
  47. {
  48. GetGame().ClearJunctureEx(m_Player, m_Dst.GetItem());
  49. }
  50. }
  51. else
  52. Error("[hndfsm] " + Object.GetDebugName(m_Player) + " STS = " + m_Player.GetSimulationTimeStamp() + " HandAnimatedMoveToDst_W4T - item " + item + " has no Inventory or Location, inv=" + item.GetInventory());
  53. }
  54. else
  55. Error("[hndfsm] HandAnimatedMoveToDst_W4T - event has no valid m_Dst");
  56. super.OnEntry(e);
  57. }
  58. override void OnAbort(HandEventBase e)
  59. {
  60. m_Dst = null;
  61. super.OnAbort(e);
  62. }
  63. override void OnExit(HandEventBase e)
  64. {
  65. m_Dst = null;
  66. super.OnExit(e);
  67. }
  68. override bool IsWaitingForActionFinish() { return true; }
  69. };
  70. class HandAnimatedMovingToAtt extends HandStateBase
  71. {
  72. EntityAI m_Entity; /// weapon to be taken
  73. ref HandStartHidingAnimated m_Hide;
  74. ref HandAnimatedMoveToDst_W4T m_Show;
  75. ref InventoryLocation m_ilEntity;
  76. void HandAnimatedMovingToAtt(Man player = null, HandStateBase parent = null)
  77. {
  78. // setup nested state machine
  79. m_Hide = new HandStartHidingAnimated(player, this, WeaponActions.HIDE, -1);
  80. m_Show = new HandAnimatedMoveToDst_W4T(player, this, WeaponActions.SHOW, -1);
  81. // events:
  82. HandEventBase _fin_ = new HandEventHumanCommandActionFinished;
  83. HandEventBase _AEh_ = new HandAnimEventChanged;
  84. m_FSM = new HandFSM(this); // @NOTE: set owner of the submachine fsm
  85. m_FSM.AddTransition(new HandTransition( m_Hide, _AEh_, m_Show ));
  86. m_FSM.AddTransition(new HandTransition( m_Show, _fin_, null ));
  87. m_FSM.SetInitialState(m_Hide);
  88. }
  89. override void OnEntry(HandEventBase e)
  90. {
  91. m_Entity = e.GetSrcEntity();
  92. HandEventMoveTo ev_move = HandEventMoveTo.Cast(e);
  93. if (ev_move)
  94. {
  95. m_Show.m_Dst = ev_move.GetDst();
  96. m_Hide.m_ActionType = ev_move.GetAnimationID();
  97. m_Show.m_ActionType = ev_move.GetAnimationID();
  98. m_ilEntity = m_Show.m_Dst;
  99. m_Player.GetHumanInventory().AddInventoryReservationEx(m_Entity, m_ilEntity, GameInventory.c_InventoryReservationTimeoutShortMS);
  100. }
  101. super.OnEntry(e); // @NOTE: super at the end (prevent override from submachine start)
  102. }
  103. override void OnAbort(HandEventBase e)
  104. {
  105. if ( !GetGame().IsDedicatedServer())
  106. {
  107. m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Entity, m_ilEntity);
  108. }
  109. else
  110. {
  111. GetGame().ClearJunctureEx(m_Player, m_Entity);
  112. }
  113. m_Entity = null;
  114. m_ilEntity = null;
  115. super.OnAbort(e);
  116. }
  117. override void OnExit(HandEventBase e)
  118. {
  119. if ( !GetGame().IsDedicatedServer())
  120. {
  121. m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Entity, m_ilEntity);
  122. }
  123. m_Entity = null;
  124. m_ilEntity = null;
  125. super.OnExit(e);
  126. }
  127. };