cacontinuoustransferquantity.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. class CAContinuousTransferQuantity : CAContinuousBase
  2. {
  3. protected float m_TargetUnits;
  4. protected float m_SpentQuantity;
  5. protected float m_ItemQuantity;
  6. protected float m_SourceQuantity;
  7. protected float m_QuantityFilledPerSecond;
  8. protected float m_TimeToComplete;
  9. protected ref Param1<float> m_SpentUnits;
  10. void CAContinuousTransferQuantity( float quantity_filled_per_second )
  11. {
  12. m_QuantityFilledPerSecond = quantity_filled_per_second;
  13. }
  14. override void Setup( ActionData action_data )
  15. {
  16. m_SpentQuantity = 0;
  17. if ( !m_SpentUnits )
  18. {
  19. m_SpentUnits = new Param1<float>(0);
  20. }
  21. else
  22. {
  23. m_SpentUnits.param1 = 0;
  24. }
  25. m_ItemQuantity = action_data.m_MainItem.GetQuantity();
  26. ItemBase trg;
  27. if ( Class.CastTo(trg, action_data.m_Target.GetObject()) )
  28. {
  29. m_SourceQuantity = trg.GetQuantity();
  30. }
  31. m_TargetUnits = action_data.m_MainItem.GetQuantityMax();
  32. m_TimeToComplete= (Math.Min((m_TargetUnits-m_ItemQuantity),m_SourceQuantity))/m_QuantityFilledPerSecond;
  33. }
  34. override int Execute( ActionData action_data )
  35. {
  36. if ( !action_data.m_Player )
  37. {
  38. return UA_ERROR;
  39. }
  40. ItemBase trg;
  41. Class.CastTo(trg, action_data.m_Target.GetObject());
  42. if ( action_data.m_MainItem.GetQuantity() >= action_data.m_MainItem.GetQuantityMax() || trg.GetQuantity() == 0 )
  43. {
  44. return UA_FINISHED;
  45. }
  46. else
  47. {
  48. if ( m_SpentQuantity < m_TargetUnits && m_SpentQuantity < m_SourceQuantity )
  49. {
  50. m_SpentQuantity += m_QuantityFilledPerSecond * action_data.m_Player.GetDeltaT();
  51. float val = m_ItemQuantity-m_SpentQuantity;
  52. if ( m_Action ) m_Action.SendMessageToClient(action_data.m_Player, val.ToString());
  53. return UA_PROCESSING;
  54. }
  55. else
  56. {
  57. CalcAndSetQuantity( action_data );
  58. OnCompletePogress(action_data);
  59. return UA_FINISHED;
  60. }
  61. }
  62. }
  63. override override int Cancel( ActionData action_data )
  64. {
  65. if ( !action_data.m_Player )
  66. {
  67. return UA_ERROR;
  68. }
  69. CalcAndSetQuantity( action_data );
  70. return UA_CANCEL;
  71. }
  72. override float GetProgress()
  73. {
  74. float progress = (m_SpentQuantity*m_QuantityFilledPerSecond)/m_TimeToComplete;
  75. return (m_SpentQuantity*m_QuantityFilledPerSecond)/m_TimeToComplete;
  76. }
  77. //---------------------------------------------------------------------------
  78. void CalcAndSetQuantity( ActionData action_data )
  79. {
  80. if ( GetGame().IsServer() )
  81. {
  82. if ( m_SpentUnits )
  83. {
  84. m_SpentUnits.param1 = m_SpentQuantity;
  85. SetACData(m_SpentUnits);
  86. }
  87. action_data.m_MainItem.AddQuantity(m_SpentQuantity);
  88. ItemBase trg;
  89. if ( Class.CastTo(trg, action_data.m_Target.GetObject()) )
  90. {
  91. trg.AddQuantity(-m_SpentQuantity,false,false);
  92. }
  93. }
  94. }
  95. };