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