actiongivebloodself.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. class ActionGiveBloodData : ActionData
  2. {
  3. int m_ItemBloodType;
  4. float m_BloodAmount;
  5. int m_Agents;
  6. }
  7. class ActionGiveBloodSelfCB : ActionContinuousBaseCB
  8. {
  9. override void CreateActionComponent()
  10. {
  11. m_ActionData.m_ActionComponent = new CAContinuousQuantityBloodTransfer(UAQuantityConsumed.BLOOD, UATimeSpent.BLOOD);
  12. }
  13. };
  14. class ActionGiveBloodSelf: ActionContinuousBase
  15. {
  16. const float CHEM_AGENT_BLOOD_REMOVAL_MODIFIER = 0.25;
  17. void ActionGiveBloodSelf()
  18. {
  19. m_CallbackClass = ActionGiveBloodSelfCB;
  20. m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_HIGH;
  21. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_SALINEBLOODBAG;
  22. m_FullBody = true;
  23. m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT | DayZPlayerConstants.STANCEMASK_CROUCH;
  24. m_Text = "#give_blood";
  25. }
  26. override void CreateConditionComponents()
  27. {
  28. m_ConditionItem = new CCINotRuinedAndEmpty;
  29. m_ConditionTarget = new CCTSelf;
  30. }
  31. override bool HasTarget()
  32. {
  33. return false;
  34. }
  35. override ActionData CreateActionData()
  36. {
  37. ActionGiveBloodData action_data = new ActionGiveBloodData;
  38. return action_data;
  39. }
  40. override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL )
  41. {
  42. if ( super.SetupAction(player, target, item, action_data, extra_data ) )
  43. {
  44. ActionGiveBloodData action_data_b = ActionGiveBloodData.Cast( action_data );
  45. action_data_b.m_ItemBloodType = action_data.m_MainItem.GetLiquidType();
  46. action_data_b.m_BloodAmount = action_data.m_MainItem.GetQuantity();
  47. action_data_b.m_Agents = action_data.m_MainItem.GetAgents();
  48. return true;
  49. }
  50. return false;
  51. }
  52. override void OnEndAnimationLoopServer( ActionData action_data )
  53. {
  54. //OnFinishProgressServer(action_data);
  55. if ( action_data.m_MainItem.IsKindOf("BloodSyringe") )
  56. {
  57. SyringeLambda lambda = new SyringeLambda(action_data.m_MainItem, "Syringe", action_data.m_Player);
  58. lambda.SetTransferParams(true, true, true);
  59. MiscGameplayFunctions.TurnItemIntoItemEx(action_data.m_Player, lambda);
  60. }
  61. }
  62. override void OnEndServer(ActionData action_data)
  63. {
  64. super.OnEndServer(action_data);
  65. ActionGiveBloodData action_data_b = ActionGiveBloodData.Cast( action_data );
  66. float blood_obtained = action_data_b.m_BloodAmount - action_data_b.m_MainItem.GetQuantity();
  67. PluginTransmissionAgents plugin = PluginTransmissionAgents.Cast(GetPlugin(PluginTransmissionAgents));
  68. plugin.TransmitAgentsEx(action_data.m_MainItem, action_data.m_Player, AGT_UACTION_TO_PLAYER,blood_obtained ,action_data_b.m_Agents);
  69. int bloodtypetarget = action_data_b.m_Player.GetStatBloodType().Get();
  70. bool bloodmatch = BloodTypes.MatchBloodCompatibility(action_data_b.m_ItemBloodType, bloodtypetarget);
  71. if ( !bloodmatch )
  72. {
  73. if (blood_obtained > PlayerConstants.HEMOLYTIC_RISK_SHOCK_THRESHOLD)
  74. {
  75. action_data_b.m_Player.m_UnconsciousEndTime = -60;
  76. action_data_b.m_Player.SetHealth("","Shock",0);
  77. if (blood_obtained > PlayerConstants.HEMOLYTIC_REACTION_THRESHOLD)
  78. {
  79. action_data_b.m_Player.m_ModifiersManager.ActivateModifier(eModifiers.MDF_HEMOLYTIC_REACTION);
  80. }
  81. }
  82. }
  83. if ( action_data_b.m_MainItem && action_data_b.m_MainItem.GetQuantity() <= 0.01 )
  84. {
  85. action_data_b.m_MainItem.SetQuantity(0);
  86. }
  87. if (!(action_data_b.m_Agents & eAgents.CHEMICAL_POISON))//does bloodbag NOT contain nerve agent ?
  88. {
  89. float remove_count_agents = blood_obtained * CHEM_AGENT_BLOOD_REMOVAL_MODIFIER;
  90. action_data.m_Player.InsertAgent(eAgents.CHEMICAL_POISON, -remove_count_agents);
  91. }
  92. }
  93. };
  94. class SyringeLambda : TurnItemIntoItemLambda
  95. {
  96. void SyringeLambda (EntityAI old_item, string new_item_type, PlayerBase player) { }
  97. };