actiongivebloodtarget.c 3.4 KB

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