ActionBuildPart.c
class BuildPartActionReciveDataclass BuildPartActionDataclass ActionBuildPartCBclass ActionBuildPartclass ActionActionBuildPartNoTool
class BuildPartActionReciveData : ActionReciveData
{
string m_PartType;
}
class BuildPartActionData : ActionData
{
string m_PartType;
};
class ActionBuildPartCB : ActionContinuousBaseCB
{
override void CreateActionComponent()
{
float time = SetCallbackDuration(m_ActionData.m_MainItem);
m_ActionData.m_ActionComponent = new CAContinuousTime(time);
}
float SetCallbackDuration(ItemBase item)
{
return UATimeSpent.BASEBUILDING_CONSTRUCT_MEDIUM;
}
};
class ActionBuildPart: ActionContinuousBase
{
void ActionBuildPart()
{
m_CallbackClass = ActionBuildPartCB;
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_ASSEMBLE;
m_FullBody = true;
m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT;
m_SpecialtyWeight = UASoftSkillsWeight.ROUGH_HIGH;
m_Text = "#build";
}
override void CreateConditionComponents()
{
m_ConditionItem = new CCINonRuined;
m_ConditionTarget = new CCTNone;
}
override void OnActionInfoUpdate(PlayerBase player, ActionTarget target, ItemBase item)
{
ConstructionActionData construction_action_data = player.GetConstructionActionData();
ConstructionPart constrution_part = construction_action_data.GetBuildPartAtIndex(m_VariantID);
if (constrution_part)
{
m_Text = "#build " + constrution_part.GetName();
}
}
override bool CanBeUsedLeaning()
{
return false;
}
override bool CanBeUsedInFreelook()
{
return false;
}
override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
{
if (player.IsPlacingLocal() || player.IsPlacingServer())
return false;
//Action not allowed if player has broken legs
if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
return false;
//gate..
if (target.GetObject() && (!target.GetObject().CanUseConstructionBuild() || target.GetObject().CanUseHandConstruction()))
return false;
if ((!g_Game.IsDedicatedServer()))
{
if (MiscGameplayFunctions.ComplexBuildCollideCheckClient(player, target, item, m_VariantID))
{
return true;
}
return false;
}
return true;
}
override bool ActionConditionContinue(ActionData action_data)
{
BaseBuildingBase base_building = BaseBuildingBase.Cast(action_data.m_Target.GetObject());
Construction construction = base_building.GetConstruction();
string part_name = BuildPartActionData.Cast(action_data).m_PartType;
CollisionCheckData check_data = new CollisionCheckData;
check_data.m_PartName = part_name;
check_data.m_AdditionalExcludes.Insert(action_data.m_Player);
bool canBuild = construction.CanBuildPart(part_name, action_data.m_MainItem, true);
if (g_Game.IsServer())
{
bool collides = construction.IsCollidingEx(check_data);
return !collides && canBuild;
}
else
{
return canBuild;
}
}
override void OnFinishProgressServer(ActionData action_data)
{
BaseBuildingBase base_building = BaseBuildingBase.Cast(action_data.m_Target.GetObject());
Construction construction = base_building.GetConstruction();
string part_name = BuildPartActionData.Cast(action_data).m_PartType;
CollisionCheckData check_data = new CollisionCheckData;
check_data.m_PartName = part_name;
check_data.m_AdditionalExcludes.Insert(action_data.m_Player);
if (!construction.IsCollidingEx(check_data) && construction.CanBuildPart(part_name, action_data.m_MainItem, true)) //redundant at this point?
{
//build
construction.BuildPartServer(action_data.m_Player, part_name, AT_BUILD_PART);
//add damage to tool
action_data.m_MainItem.DecreaseHealth(UADamageApplied.BUILD, false);
}
}
override string GetSoundCategory(ActionData action_data)
{
return "Base_building";
}
override ActionData CreateActionData()
{
BuildPartActionData action_data = new BuildPartActionData;
return action_data;
}
//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))
{
SetBuildingAnimation(item);
if (!g_Game.IsDedicatedServer())
{
ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
BuildPartActionData.Cast(action_data).m_PartType = construction_action_data.GetBuildPartAtIndex(m_VariantID).GetPartName();
}
return true;
}
return false;
}
protected void SetBuildingAnimation(ItemBase item)
{
switch (item.Type())
{
case Pickaxe:
case Shovel:
case FarmingHoe:
case FieldShovel:
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DIG;
break;
case Pliers:
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_INTERACT;
break;
case SledgeHammer:
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_MINEROCK;
break;
default:
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_ASSEMBLE;
break;
}
}
override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
{
super.WriteToContext(ctx, action_data);
ctx.Write(BuildPartActionData.Cast(action_data).m_PartType);
}
override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data)
{
action_recive_data = new BuildPartActionReciveData;
super.ReadFromContext(ctx, action_recive_data);
string part_type;
if (ctx.Read(part_type))
{
BuildPartActionReciveData.Cast(action_recive_data).m_PartType = part_type;
return true;
}
else
{
return false;
}
}
override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
{
super.HandleReciveData(action_recive_data, action_data);
BuildPartActionData.Cast(action_data).m_PartType = BuildPartActionReciveData.Cast(action_recive_data).m_PartType;
}
override string GetAdminLogMessage(ActionData action_data)
{
ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
string partName = BuildPartActionData.Cast(action_data).m_PartType;
string message = string.Format("Built %1 on %2 with %3", partName, action_data.m_Target.GetObject().GetDisplayName(), action_data.m_MainItem.GetDisplayName());
return message;
}
}
class ActionActionBuildPartNoTool: ActionBuildPart
{
override typename GetInputType()
{
return ContinuousInteractActionInput;
}
override bool UseMainItem()
{
return false;
}
override bool HasProgress()
{
return true;
}
override bool HasAlternativeInterrupt()
{
return false;
}
}