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