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