ActionBuildShelter.c
class ActionBuildShelter: ActionContinuousBase
{
string m_SoundsetBuildStart;
string m_SoundsetBuildLoop;
string m_SoundsetBuildFinish;
ref protected EffectSound m_BuildLoopSound;
void ActionBuildShelter()
{
m_CallbackClass = ActionBuildPartCB;
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_2HD;
m_FullBody = true;
m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT | DayZPlayerConstants.STANCEMASK_CROUCH;
m_Text = "#build_shelter_leather";
}
void ~ActionBuildShelter()
{
DestroyActionLoopSound();
}
override void CreateConditionComponents()
{
m_ConditionItem = new CCINone;
m_ConditionTarget = new CCTCursor;
}
override string GetText()
{
PlayerBase player = PlayerBase.Cast( g_Game.GetPlayer() );
if ( player )
{
ConstructionActionData construction_action_data = player.GetConstructionActionData();
ConstructionPart constrution_part = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID);
if ( constrution_part )
{
string ret = "";
switch (constrution_part.GetName())
{
case "leather":
ret = "#build_shelter_leather";
break;
case "fabric":
ret = "#build_shelter_fabric";
break;
case "stick":
ret = "#build_shelter_stick";
break;
}
}
}
return ret;
}
override void OnActionInfoUpdate( PlayerBase player, ActionTarget target, ItemBase item )
{
ConstructionActionData construction_action_data = player.GetConstructionActionData();
ConstructionPart constrution_part = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID);
if ( constrution_part )
{
switch (constrution_part.GetName())
{
case "leather":
m_Text = "#build_shelter_leather";
break;
case "fabric":
m_Text = "#build_shelter_fabric";
break;
case "stick":
m_Text = "#build_shelter_stick";
break;
}
}
}
override bool CanBeUsedLeaning()
{
return false;
}
override typename GetInputType()
{
return ContinuousInteractActionInput;
}
override bool UseMainItem()
{
return false;
}
override bool HasProgress()
{
return true;
}
override bool HasAlternativeInterrupt()
{
return false;
}
override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
{
//Action not allowed if player has broken legs
if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
return false;
if (target.GetObject() && !target.GetObject().CanUseConstructionBuild())
return false;
if ( player.IsPlacingLocal() || player.IsPlacingServer() )
return false;
if ( (!g_Game.IsDedicatedServer()) )
{
if ( MiscGameplayFunctions.ComplexBuildCollideCheckClient(player, target, item, m_VariantID ) )
{
return true;
}
return false;
}
return true;
}
//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 ) )
{
if ( !g_Game.IsDedicatedServer() )
{
ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
BuildPartActionData.Cast(action_data).m_PartType = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID).GetPartName();
}
return true;
}
return false;
}
override ActionData CreateActionData()
{
BuildPartActionData action_data = new BuildPartActionData;
return action_data;
}
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 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);
return !construction.IsCollidingEx( check_data ) && construction.CanBuildPart( part_name, action_data.m_MainItem, false );
}
override void OnStart( ActionData action_data )
{
super.OnStart(action_data);
action_data.m_Player.TryHideItemInHands(true);
}
override void OnStartClient( ActionData action_data )
{
super.OnStartClient(action_data);
DetermineConstructionSounds(action_data);
PlayActionStartSound(action_data);
}
override void OnStartAnimationLoopClient( ActionData action_data )
{
super.OnStartAnimationLoopClient(action_data);
PlayActionLoopSound(action_data);
}
override void OnEnd( ActionData action_data )
{
super.OnEnd(action_data);
action_data.m_Player.TryHideItemInHands(false);
}
override void OnEndClient( ActionData action_data )
{
super.OnEndClient(action_data);
StopActionLoopSound();
//DestroyActionLoopSound();
}
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;
if ( !construction.IsColliding( part_name ) && construction.CanBuildPart( part_name, action_data.m_MainItem, false ) )
{
//build
construction.BuildPartServer( action_data.m_Player, part_name, AT_BUILD_PART );
}
}
override void OnFinishProgressClient( ActionData action_data )
{
super.OnFinishProgressClient(action_data);
PlayActionFinishSound(action_data);
}
void DetermineConstructionSounds( ActionData action_data )
{
ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
ConstructionPart constrution_part = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID);;
if (constrution_part)
{
switch (constrution_part.GetName())
{
case "leather":
m_SoundsetBuildStart = "Shelter_Leather_Build_Start_SoundSet";
m_SoundsetBuildLoop = "Shelter_Leather_Build_Loop_SoundSet";
m_SoundsetBuildFinish = "Shelter_Leather_Build_Finish_SoundSet";
break;
case "fabric":
m_SoundsetBuildStart = "Shelter_Fabric_Build_Start_SoundSet";
m_SoundsetBuildLoop = "Shelter_Fabric_Build_Loop_SoundSet";
m_SoundsetBuildFinish = "Shelter_Fabric_Build_Finish_SoundSet";
break;
case "stick":
m_SoundsetBuildStart = "Shelter_Wooden_Stick_Build_Start_SoundSet";
m_SoundsetBuildLoop = "Shelter_Wooden_Stick_Build_Loop_SoundSet";
m_SoundsetBuildFinish = "Shelter_Wooden_Stick_Build_Finish_SoundSet";
break;
default:
m_SoundsetBuildStart = "";
m_SoundsetBuildLoop = "";
m_SoundsetBuildFinish = "";
break;
}
}
}
void PlayActionStartSound( ActionData action_data )
{
EffectSound sound = SEffectManager.PlaySound(m_SoundsetBuildStart, action_data.m_Target.GetObject().GetPosition());
sound.SetAutodestroy( true );
}
void PlayActionLoopSound( ActionData action_data )
{
if ( !m_BuildLoopSound || !m_BuildLoopSound.IsSoundPlaying() )
{
m_BuildLoopSound = SEffectManager.PlaySound( m_SoundsetBuildLoop, action_data.m_Target.GetObject().GetPosition(), 0, 0, true );
}
}
void StopActionLoopSound()
{
if (m_BuildLoopSound)
{
m_BuildLoopSound.SetSoundFadeOut(0.5);
m_BuildLoopSound.SoundStop();
}
}
void DestroyActionLoopSound()
{
SEffectManager.DestroyEffect( m_BuildLoopSound );
}
void PlayActionFinishSound( ActionData action_data )
{
EffectSound sound = SEffectManager.PlaySound(m_SoundsetBuildFinish, action_data.m_Target.GetObject().GetPosition());
sound.SetAutodestroy( true );
}
override string GetSoundCategory(ActionData action_data)
{
return "Base_building";
}
}