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