ActionLightItemOnFire.c
class ActionLightItemOnFireCB : ActionContinuousBaseCB
{
override void CreateActionComponent()
{
m_ActionData.m_ActionComponent = new CAContinuousTime( UATimeSpent.FIREPLACE_IGNITE );
}
}
class ActionLightItemOnFire: ActionContinuousBase
{
void ActionLightItemOnFire()
{
m_CallbackClass = ActionLightItemOnFireCB;
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_STARTFIRE;
m_FullBody = true;
m_StanceMask = DayZPlayerConstants.STANCEMASK_CROUCH;
m_SpecialtyWeight = UASoftSkillsWeight.ROUGH_HIGH;
m_Text = "#ignite";
}
override void CreateConditionComponents()
{
m_ConditionTarget = new CCTNonRuined( UAMaxDistances.DEFAULT );
m_ConditionItem = new CCINonRuined;
}
override bool CanBePerformedFromQuickbar()
{
return true;
}
// Removed as a fix for igniting Torch by Matchbox through drag&drop in inventory
/*override bool CanBePerformedFromInventory()
{
return true;
}*/
// Check if ignite candidate is in cargo of something or not.
bool IsItemInCargoOfSomething(ItemBase item)
{
if ( item.GetInventory() )
{
InventoryLocation loc = new InventoryLocation;
item.GetInventory().GetCurrentInventoryLocation(loc);
if ( loc.GetIdx() > -1 )
{
return true;
}
}
return false;
}
override bool ActionConditionContinue( ActionData action_data )
{
FireworksBase fireworks = FireworksBase.Cast( action_data.m_Target.GetObject() );
if (fireworks)
{
return true;//something might begin occluding the item after the ignition began, we don't want that to cancel the ignition process, not the prettiest solution, but it works
}
else
{
return ActionCondition(action_data.m_Player, action_data.m_Target,action_data.m_MainItem);
}
}
override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
{
ItemBase targetItem = ItemBase.Cast(target.GetObject());
if (targetItem && item)
{
// when igniting item on the ground with igniter in hands
if (!targetItem.IsIgnited() && !IsItemInCargoOfSomething(targetItem) && item.CanIgniteItem(targetItem) && targetItem.CanBeIgnitedBy(item))
{
// oven stage of standard fireplace
if (targetItem.IsKindOf("Fireplace"))
{
if (Fireplace.Cast(targetItem).IsOven())
return true;
if (Fireplace.CanIgniteEntityAsFireplace(targetItem))
return true;
return false;
}
return true;
}
// when igniting item in hands from something on ground
else if (!item.IsIgnited() && !IsItemInCargoOfSomething(item) && targetItem.CanIgniteItem(item) && item.CanBeIgnitedBy(targetItem))
{
return true;
}
}
return false;
}
override void OnFinishProgressServer( ActionData action_data )
{
ClearActionJuncture(action_data);
ItemBase target_item = ItemBase.Cast( action_data.m_Target.GetObject() );
ItemBase item = action_data.m_MainItem;
bool is_ignition_successful;
ItemBase ignited_item; //item that was lit on fire
ItemBase fire_source_item; //item that was the source of fire
if ( item.CanIgniteItem( target_item ) )
{
is_ignition_successful = target_item.IsThisIgnitionSuccessful( item );
ignited_item = target_item;
fire_source_item = item;
}
else if ( item.CanBeIgnitedBy( target_item ) )
{
is_ignition_successful = target_item.IsTargetIgnitionSuccessful( item );
ignited_item = item;
fire_source_item = target_item;
}
if ( is_ignition_successful )
{
fire_source_item.OnIgnitedTarget( ignited_item );
ignited_item.OnIgnitedThis( fire_source_item );
}
else
{
fire_source_item.OnIgnitedTargetFailed( ignited_item );
ignited_item.OnIgnitedThisFailed( fire_source_item );
}
}
//setup
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 ) )
{
ItemBase target_item = ItemBase.Cast( target.GetObject() );
if ( target_item )
{
SetIgnitingAnimation( target_item );
}
return true;
}
return false;
}
void SetIgnitingAnimation( ItemBase target_item )
{
if ( target_item.HasFlammableMaterial() )
{
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_STARTFIRE;
}
else
{
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_CRAFTING;
}
}
}