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