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