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