ActionGiveBloodSelf.c
class ActionGiveBloodData : ActionData
{
int m_ItemBloodType;
float m_BloodAmount;
int m_Agents;
}
class ActionGiveBloodSelfCB : ActionContinuousBaseCB
{
override void CreateActionComponent()
{
m_ActionData.m_ActionComponent = new CAContinuousQuantityBloodTransfer(UAQuantityConsumed.BLOOD, UATimeSpent.BLOOD);
}
};
class ActionGiveBloodSelf: ActionContinuousBase
{
const float CHEM_AGENT_BLOOD_REMOVAL_MODIFIER = 0.25;
void ActionGiveBloodSelf()
{
m_CallbackClass = ActionGiveBloodSelfCB;
m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_HIGH;
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_SALINEBLOODBAG;
m_FullBody = true;
m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT | DayZPlayerConstants.STANCEMASK_CROUCH;
m_Text = "#give_blood";
}
override void CreateConditionComponents()
{
m_ConditionItem = new CCINotRuinedAndEmpty;
m_ConditionTarget = new CCTSelf;
}
override bool HasTarget()
{
return false;
}
override ActionData CreateActionData()
{
ActionGiveBloodData action_data = new ActionGiveBloodData;
return action_data;
}
override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL )
{
if ( super.SetupAction(player, target, item, action_data, extra_data ) )
{
ActionGiveBloodData action_data_b = ActionGiveBloodData.Cast( action_data );
action_data_b.m_ItemBloodType = action_data.m_MainItem.GetLiquidType();
action_data_b.m_BloodAmount = action_data.m_MainItem.GetQuantity();
action_data_b.m_Agents = action_data.m_MainItem.GetAgents();
return true;
}
return false;
}
override void OnEndAnimationLoopServer( ActionData action_data )
{
//OnFinishProgressServer(action_data);
if ( action_data.m_MainItem.IsKindOf("BloodSyringe") )
{
SyringeLambda lambda = new SyringeLambda(action_data.m_MainItem, "Syringe", action_data.m_Player);
lambda.SetTransferParams(true, true, true);
MiscGameplayFunctions.TurnItemIntoItemEx(action_data.m_Player, lambda);
}
}
override void OnEndServer(ActionData action_data)
{
super.OnEndServer(action_data);
ActionGiveBloodData action_data_b = ActionGiveBloodData.Cast( action_data );
float blood_obtained = action_data_b.m_BloodAmount - action_data_b.m_MainItem.GetQuantity();
PluginTransmissionAgents plugin = PluginTransmissionAgents.Cast(GetPlugin(PluginTransmissionAgents));
plugin.TransmitAgentsEx(action_data.m_MainItem, action_data.m_Player, AGT_UACTION_TO_PLAYER,blood_obtained ,action_data_b.m_Agents);
int bloodtypetarget = action_data_b.m_Player.GetStatBloodType().Get();
bool bloodmatch = BloodTypes.MatchBloodCompatibility(action_data_b.m_ItemBloodType, bloodtypetarget);
if ( !bloodmatch )
{
if (blood_obtained > PlayerConstants.HEMOLYTIC_RISK_SHOCK_THRESHOLD)
{
action_data_b.m_Player.m_UnconsciousEndTime = -60;
action_data_b.m_Player.SetHealth("","Shock",0);
if (blood_obtained > PlayerConstants.HEMOLYTIC_REACTION_THRESHOLD)
{
action_data_b.m_Player.m_ModifiersManager.ActivateModifier(eModifiers.MDF_HEMOLYTIC_REACTION);
}
}
}
if ( action_data_b.m_MainItem && action_data_b.m_MainItem.GetQuantity() <= 0.01 )
{
action_data_b.m_MainItem.SetQuantity(0);
}
if (!(action_data_b.m_Agents & eAgents.CHEMICAL_POISON))//does bloodbag NOT contain nerve agent ?
{
float remove_count_agents = blood_obtained * CHEM_AGENT_BLOOD_REMOVAL_MODIFIER;
action_data.m_Player.InsertAgent(eAgents.CHEMICAL_POISON, -remove_count_agents);
}
}
};
class SyringeLambda : TurnItemIntoItemLambda
{
void SyringeLambda (EntityAI old_item, string new_item_type, PlayerBase player) { }
};