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