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