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