549class ActionBuildShelter: ActionContinuousBase
550{
551 string m_SoundsetBuildStart;
552 string m_SoundsetBuildLoop;
553 string m_SoundsetBuildFinish;
554 ref protected EffectSound m_BuildLoopSound;
555
556 void ActionBuildShelter()
557 {
558 m_CallbackClass = ActionBuildPartCB;
559 m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_2HD;
560 m_FullBody = true;
561 m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT | DayZPlayerConstants.STANCEMASK_CROUCH;
562 m_Text = "#build_shelter_leather";
563 }
564
565 void ~ActionBuildShelter()
566 {
567 DestroyActionLoopSound();
568 }
569
570 override void CreateConditionComponents()
571 {
572 m_ConditionItem = new CCINone;
573 m_ConditionTarget = new CCTCursor;
574 }
575
576 override string GetText()
577 {
578 PlayerBase player = PlayerBase.Cast( GetGame().GetPlayer() );
579 if ( player )
580 {
581 ConstructionActionData construction_action_data = player.GetConstructionActionData();
582 ConstructionPart constrution_part = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID);
583
584 if ( constrution_part )
585 {
586 string ret = "";
587 switch (constrution_part.GetName())
588 {
589 case "leather":
590 ret = "#build_shelter_leather";
591 break;
592
593 case "fabric":
594 ret = "#build_shelter_fabric";
595 break;
596
597 case "stick":
598 ret = "#build_shelter_stick";
599 break;
600 }
601 }
602 }
603
604 return ret;
605 }
606
607 override void OnActionInfoUpdate( PlayerBase player, ActionTarget target, ItemBase item )
608 {
609 ConstructionActionData construction_action_data = player.GetConstructionActionData();
610 ConstructionPart constrution_part = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID);
611
612 if ( constrution_part )
613 {
614 switch (constrution_part.GetName())
615 {
616 case "leather":
617 m_Text = "#build_shelter_leather";
618 break;
619
620 case "fabric":
621 m_Text = "#build_shelter_fabric";
622 break;
623
624 case "stick":
625 m_Text = "#build_shelter_stick";
626 break;
627 }
628 }
629 }
630
631 override bool CanBeUsedLeaning()
632 {
633 return false;
634 }
635
636 override typename GetInputType()
637 {
638 return ContinuousInteractActionInput;
639 }
640
641 override bool UseMainItem()
642 {
643 return false;
644 }
645
646 override bool HasProgress()
647 {
648 return true;
649 }
650
651 override bool HasAlternativeInterrupt()
652 {
653 return false;
654 }
655
656 override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
657 {
658 //Action not allowed if player has broken legs
659 if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
660 return false;
661
662 if (target.GetObject() && !target.GetObject().CanUseConstructionBuild())
663 return false;
664 if ( player.IsPlacingLocal() || player.IsPlacingServer() )
665 return false;
666
667 if ( (!g_Game.IsDedicatedServer()) )
668 {
669 if ( MiscGameplayFunctions.ComplexBuildCollideCheckClient(player, target, item, m_VariantID ) )
670 {
671 return true;
672 }
673 return false;
674 }
675 return true;
676 }
677
678 //setup
679 override bool SetupAction( PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL )
680 {
681 if ( super.SetupAction( player, target, item, action_data, extra_data ) )
682 {
683 if ( !g_Game.IsDedicatedServer() )
684 {
685 ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
686 BuildPartActionData.Cast(action_data).m_PartType = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID).GetPartName();
687 }
688 return true;
689 }
690
691 return false;
692 }
693
694 override ActionData CreateActionData()
695 {
696 BuildPartActionData action_data = new BuildPartActionData;
697 return action_data;
698 }
699
700 override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
701 {
702 super.WriteToContext(ctx, action_data);
703
704 ctx.Write(BuildPartActionData.Cast(action_data).m_PartType);
705 }
706
707 override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data )
708 {
709 action_recive_data = new BuildPartActionReciveData;
710 super.ReadFromContext(ctx, action_recive_data);
711
712 string part_type;
713 if ( ctx.Read(part_type) )
714 {
715 BuildPartActionReciveData.Cast( action_recive_data ).m_PartType = part_type;
716 return true;
717 }
718 else
719 {
720 return false;
721 }
722 }
723
724 override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
725 {
726 super.HandleReciveData(action_recive_data, action_data);
727
728 BuildPartActionData.Cast(action_data).m_PartType = BuildPartActionReciveData.Cast( action_recive_data ).m_PartType;
729 }
730
731 override bool ActionConditionContinue( ActionData action_data )
732 {
733 BaseBuildingBase base_building = BaseBuildingBase.Cast( action_data.m_Target.GetObject() );
734 Construction construction = base_building.GetConstruction();
735 string part_name = BuildPartActionData.Cast(action_data).m_PartType;
736 CollisionCheckData check_data = new CollisionCheckData;
737
738 check_data.m_PartName = part_name;
739 check_data.m_AdditionalExcludes.Insert(action_data.m_Player);
740
741 return !construction.IsCollidingEx( check_data ) && construction.CanBuildPart( part_name, action_data.m_MainItem, false );
742 }
743
744 override void OnStart( ActionData action_data )
745 {
746 super.OnStart(action_data);
747 action_data.m_Player.TryHideItemInHands(true);
748 }
749
750 override void OnStartClient( ActionData action_data )
751 {
752 super.OnStartClient(action_data);
753
754 DetermineConstructionSounds(action_data);
755 PlayActionStartSound(action_data);
756 }
757
758 override void OnStartAnimationLoopClient( ActionData action_data )
759 {
760 super.OnStartAnimationLoopClient(action_data);
761
762 PlayActionLoopSound(action_data);
763 }
764
765 override void OnEnd( ActionData action_data )
766 {
767 super.OnEnd(action_data);
768 action_data.m_Player.TryHideItemInHands(false);
769 }
770
771 override void OnEndClient( ActionData action_data )
772 {
773 super.OnEndClient(action_data);
774
775 StopActionLoopSound();
776 //DestroyActionLoopSound();
777 }
778
779 override void OnFinishProgressServer( ActionData action_data )
780 {
781 BaseBuildingBase base_building = BaseBuildingBase.Cast( action_data.m_Target.GetObject() );
782 Construction construction = base_building.GetConstruction();
783
784 string part_name = BuildPartActionData.Cast(action_data).m_PartType;
785
786 //build
787 construction.BuildPartServerEx( action_data.m_Player, part_name, AT_BUILD_PART );
788 }
789
790 override void OnFinishProgressClient( ActionData action_data )
791 {
792 super.OnFinishProgressClient(action_data);
793
794 PlayActionFinishSound(action_data);
795 }
796
797 void DetermineConstructionSounds( ActionData action_data )
798 {
799 ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
800 ConstructionPart constrution_part = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID);
801 if (constrution_part)
802 {
803 switch (constrution_part.GetName())
804 {
805 case "leather":
806 m_SoundsetBuildStart = "Shelter_Leather_Build_Start_SoundSet";
807 m_SoundsetBuildLoop = "Shelter_Leather_Build_Loop_SoundSet";
808 m_SoundsetBuildFinish = "Shelter_Leather_Build_Finish_SoundSet";
809 break;
810
811 case "fabric":
812 m_SoundsetBuildStart = "Shelter_Fabric_Build_Start_SoundSet";
813 m_SoundsetBuildLoop = "Shelter_Fabric_Build_Loop_SoundSet";
814 m_SoundsetBuildFinish = "Shelter_Fabric_Build_Finish_SoundSet";
815 break;
816
817 case "stick":
818 m_SoundsetBuildStart = "Shelter_Wooden_Stick_Build_Start_SoundSet";
819 m_SoundsetBuildLoop = "Shelter_Wooden_Stick_Build_Loop_SoundSet";
820 m_SoundsetBuildFinish = "Shelter_Wooden_Stick_Build_Finish_SoundSet";
821 break;
822
823 default:
824 m_SoundsetBuildStart = "";
825 m_SoundsetBuildLoop = "";
826 m_SoundsetBuildFinish = "";
827 break;
828 }
829 }
830 }
831
832 void PlayActionStartSound( ActionData action_data )
833 {
834 EffectSound sound = SEffectManager.PlaySound(m_SoundsetBuildStart, action_data.m_Target.GetObject().GetPosition());
835 sound.SetAutodestroy( true );
836 }
837
838 void PlayActionLoopSound( ActionData action_data )
839 {
840 if ( !m_BuildLoopSound || !m_BuildLoopSound.IsSoundPlaying() )
841 {
842 m_BuildLoopSound = SEffectManager.PlaySound( m_SoundsetBuildLoop, action_data.m_Target.GetObject().GetPosition(), 0, 0, true );
843 }
844 }
845
846 void StopActionLoopSound()
847 {
848 if (m_BuildLoopSound)
849 {
850 m_BuildLoopSound.SetSoundFadeOut(0.5);
851 m_BuildLoopSound.SoundStop();
852 }
853 }
854
855 void DestroyActionLoopSound()
856 {
857 SEffectManager.DestroyEffect( m_BuildLoopSound );
858 }
859
860 void PlayActionFinishSound( ActionData action_data )
861 {
862 EffectSound sound = SEffectManager.PlaySound(m_SoundsetBuildFinish, action_data.m_Target.GetObject().GetPosition());
863 sound.SetAutodestroy( true );
864 }
865
866 override string GetSoundCategory(ActionData action_data)
867 {
868 return "Base_building";
869 }
870}
871
872class BuildShelterFromShelterSiteLambda : ReplaceItemWithNewLambdaBase
873{
874 void BuildShelterFromShelterSiteLambda(EntityAI old_item, string new_item_type, PlayerBase player)
875 {
876 m_OldItem = old_item;
877 m_NewItemType = new_item_type;
878 }
879
880 override void CopyOldPropertiesToNew(notnull EntityAI old_item, EntityAI new_item)
881 {
882 super.CopyOldPropertiesToNew(old_item, new_item);
883
884 MiscGameplayFunctions.TransferItemProperties(old_item, new_item);
885 }
886}