ActionUnrestrainTarget.c
class ActionUnrestrainTargetCBclass ActionUnrestrainTargetclass ReplaceAndDestroyLambdaclass ReplaceAndDestroyLambdaEx
class ActionUnrestrainTargetCB : ActionContinuousBaseCB
{
const float DEFAULT_UNRESTRAIN_TIME = 2;
override void CreateActionComponent()
{
float time = ObtainUnrestrainTime();
if( time <=0 )
{
time = DEFAULT_UNRESTRAIN_TIME;
}
if( m_ActionData.m_Player.IsQuickRestrain() )
{
time = DEBUG_QUICK_UNRESTRAIN_TIME;
}
m_ActionData.m_ActionComponent = new CAContinuousTime(time);
}
float ObtainUnrestrainTime()
{
PlayerBase target_player = PlayerBase.Cast(m_ActionData.m_Target.GetObject());
PlayerBase source_player = m_ActionData.m_Player;
if (target_player.IsRestrained())
{
EntityAI item_in_hands_source = source_player.GetItemInHands();
ItemBase item_in_hands_target = target_player.GetItemInHands();
CachedObjectsArrays.ARRAY_STRING.Clear();
item_in_hands_target.ConfigGetTextArray( "CanBeUnrestrainedBy", CachedObjectsArrays.ARRAY_STRING );
string item_in_hands_name = item_in_hands_source.GetType();
for(int i = 0; i < CachedObjectsArrays.ARRAY_STRING.Count(); i++)
{
if((i % 2) == 0)
{
string class_name = CachedObjectsArrays.ARRAY_STRING.Get(i);
if( g_Game.IsKindOf(item_in_hands_name, class_name) )
{
float value = CachedObjectsArrays.ARRAY_STRING.Get(i+1).ToFloat();
return value;
}
}
}
}
return -1;
}
};
class ActionUnrestrainTarget: ActionContinuousBase
{
void ActionUnrestrainTarget()
{
m_CallbackClass = ActionUnrestrainTargetCB;
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_UNRESTRAINTARGET;
m_FullBody = true;
m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT | DayZPlayerConstants.STANCEMASK_CROUCH;
m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_LOW;
m_Text = "#unrestrain";
}
override void CreateConditionComponents()
{
m_ConditionTarget = new CCTMan(UAMaxDistances.DEFAULT, false);
m_ConditionItem = new CCINonRuined;
}
override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
{
PlayerBase other_player = PlayerBase.Cast(target.GetObject());
EntityAI item_in_hands_source = player.GetItemInHands();
if( other_player.IsRestrained() )
{
//Print("is restrained");
EntityAI item_in_hands_target = other_player.GetItemInHands();
CachedObjectsArrays.ARRAY_STRING.Clear();
if( item_in_hands_target )
{
item_in_hands_target.ConfigGetTextArray( "CanBeUnrestrainedBy", CachedObjectsArrays.ARRAY_STRING );
string item_in_hands_name = item_in_hands_source.GetType();
for(int i = 0; i < CachedObjectsArrays.ARRAY_STRING.Count(); i++)
{
if((i % 2) == 0)
{
string class_name = CachedObjectsArrays.ARRAY_STRING.Get(i);
if( g_Game.IsKindOf(item_in_hands_name, class_name) )
{
return true;
}
}
}
}
}
return false;
}
override void OnFinishProgressServer( ActionData action_data )
{
PlayerBase player_target = PlayerBase.Cast(action_data.m_Target.GetObject());
PlayerBase player_source = PlayerBase.Cast(action_data.m_Player);
if (CanReceiveAction(action_data.m_Target) && player_target.IsRestrained())
{
EntityAI unrestraining_tool = action_data.m_MainItem;
EntityAI restraining_item = player_target.GetItemInHands();
player_target.SetRestrained(false);
//Damage applied to tool
CachedObjectsArrays.ARRAY_STRING.Clear();
restraining_item.ConfigGetTextArray( "CanBeUnrestrainedBy", CachedObjectsArrays.ARRAY_STRING );
restraining_item.ConfigGetFloatArray( "CanBeUnrestrainedByDMG", CachedObjectsArrays.ARRAY_FLOAT );
string item_in_hands_name = unrestraining_tool.GetType();
float damageToTool = 0;
for(int i = 0; i < CachedObjectsArrays.ARRAY_STRING.Count(); i++)
{
string class_name = CachedObjectsArrays.ARRAY_STRING.Get(i);
if( g_Game.IsKindOf(item_in_hands_name, class_name) )
{
damageToTool = CachedObjectsArrays.ARRAY_FLOAT.Get(i/2);
break;
}
}
MiscGameplayFunctions.DealAbsoluteDmg(action_data.m_MainItem, damageToTool);
//---------------------------
MiscGameplayFunctions.TransformRestrainItem(restraining_item, unrestraining_tool, player_source, player_target);
}
}
};
class ReplaceAndDestroyLambda : TurnItemIntoItemLambdaAnimSysNotifyLambda
{
PlayerBase m_TargetPlayer;
bool m_Destroy;
bool m_Drop;
void ReplaceAndDestroyLambda(EntityAI old_item, string new_item_type, PlayerBase player, bool destroy = false)
{
m_TargetPlayer = player;
m_Destroy = destroy;
m_OldItem = old_item;
}
override void OnSuccess(EntityAI new_item)
{
super.OnSuccess(new_item);
if ( m_Destroy )
{
new_item.SetHealth("","",0);
}
}
};
class ReplaceAndDestroyLambdaEx : ReplaceAndDestroyLambda
{
void ReplaceAndDestroyLambdaEx(EntityAI old_item, string new_item_type, PlayerBase player, bool destroy = false, bool enableDrop = true)
{
m_Drop = enableDrop;
}
override protected EntityAI CreateNewEntity()
{
EntityAI newItem = super.CreateNewEntity();
if (!newItem && m_Drop)
{
newItem = EntityAI.Cast(g_Game.CreateObjectEx(m_NewItemType, m_TargetPlayer.GetPosition(), ECE_PLACE_ON_SURFACE|ECE_LOCAL));
}
return newItem;
}
};