DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ SoundDestroyStart()

void bsbDebugPrint::SoundDestroyStart ( string part_name)
protected

См. определение в файле BaseBuildingBase.c строка 2457

2459{
2460 const string ANIMATION_DEPLOYED = "Deployed";
2461
2462 float m_ConstructionKitHealth; //stored health value for used construction kit
2463
2465
2466 bool m_HasBase;
2467 //variables for synchronization of base building parts (2x31 is the current limit)
2468 int m_SyncParts01; //synchronization for already built parts (31 parts)
2469 int m_SyncParts02; //synchronization for already built parts (+31 parts)
2470 int m_SyncParts03; //synchronization for already built parts (+31 parts)
2471 int m_InteractedPartId; //construction part id that an action was performed on
2472 int m_PerformedActionId; //action id that was performed on a construction part
2473
2474 //Sounds
2475 //build
2476 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
2477 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
2478 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
2479 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
2480 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
2481 //dismantle
2482 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
2483 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
2484 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
2485 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
2486 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
2487
2488 protected EffectSound m_Sound;
2489
2493
2494 // Constructor
2495 void BaseBuildingBase()
2496 {
2498
2499 //synchronized variables
2500 RegisterNetSyncVariableInt( "m_SyncParts01" );
2501 RegisterNetSyncVariableInt( "m_SyncParts02" );
2502 RegisterNetSyncVariableInt( "m_SyncParts03" );
2503 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2504 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2505 RegisterNetSyncVariableBool( "m_HasBase" );
2506
2507 //Construction init
2509
2510 if (ConfigIsExisting("hybridAttachments"))
2511 {
2513 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
2514 }
2515 if (ConfigIsExisting("mountables"))
2516 {
2518 ConfigGetTextArray("mountables", m_Mountables);
2519 }
2520
2521 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
2522 }
2523
2524 override void EEDelete(EntityAI parent)
2525 {
2526 super.EEDelete(parent);
2527
2528 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
2529 {
2530 areaDamage.Destroy();
2531 }
2532
2533 }
2534
2535 override string GetInvulnerabilityTypeString()
2536 {
2537 return "disableBaseDamage";
2538 }
2539
2540 override bool CanObstruct()
2541 {
2542 return true;
2543 }
2544
2545 override int GetHideIconMask()
2546 {
2547 return EInventoryIconVisibility.HIDE_VICINITY;
2548 }
2549
2550 // --- SYNCHRONIZATION
2552 {
2553 if ( GetGame().IsServer() )
2554 {
2555 SetSynchDirty();
2556 }
2557 }
2558
2559 override void OnVariablesSynchronized()
2560 {
2561 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
2562 super.OnVariablesSynchronized();
2563
2565 }
2566
2567 protected void OnSynchronizedClient()
2568 {
2569 //update parts
2571
2572 //update action on part
2574
2575 //update visuals (client)
2576 UpdateVisuals();
2577 }
2578
2579 //parts synchronization
2580 void RegisterPartForSync( int part_id )
2581 {
2582 //part_id must starts from index = 1
2583 int offset;
2584 int mask;
2585
2586 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2587 {
2588 offset = part_id - 1;
2589 mask = 1 << offset;
2590
2591 m_SyncParts01 = m_SyncParts01 | mask;
2592 }
2593 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2594 {
2595 offset = ( part_id % 32 );
2596 mask = 1 << offset;
2597
2598 m_SyncParts02 = m_SyncParts02 | mask;
2599 }
2600 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2601 {
2602 offset = ( part_id % 63 );
2603 mask = 1 << offset;
2604
2605 m_SyncParts03 = m_SyncParts03 | mask;
2606 }
2607 }
2608
2609 void UnregisterPartForSync( int part_id )
2610 {
2611 //part_id must starts from index = 1
2612 int offset;
2613 int mask;
2614
2615 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2616 {
2617 offset = part_id - 1;
2618 mask = 1 << offset;
2619
2620 m_SyncParts01 = m_SyncParts01 & ~mask;
2621 }
2622 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2623 {
2624 offset = ( part_id % 32 );
2625 mask = 1 << offset;
2626
2627 m_SyncParts02 = m_SyncParts02 & ~mask;
2628 }
2629 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2630 {
2631 offset = ( part_id % 63 );
2632 mask = 1 << offset;
2633
2634 m_SyncParts03 = m_SyncParts03 & ~mask;
2635 }
2636 }
2637
2638 bool IsPartBuildInSyncData( int part_id )
2639 {
2640 //part_id must starts from index = 1
2641 int offset;
2642 int mask;
2643
2644 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2645 {
2646 offset = part_id - 1;
2647 mask = 1 << offset;
2648
2649 if ( ( m_SyncParts01 & mask ) > 0 )
2650 {
2651 return true;
2652 }
2653 }
2654 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2655 {
2656 offset = ( part_id % 32 );
2657 mask = 1 << offset;
2658
2659 if ( ( m_SyncParts02 & mask ) > 0 )
2660 {
2661 return true;
2662 }
2663 }
2664 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2665 {
2666 offset = ( part_id % 63 );
2667 mask = 1 << offset;
2668
2669 if ( ( m_SyncParts03 & mask ) > 0 )
2670 {
2671 return true;
2672 }
2673 }
2674
2675 return false;
2676 }
2677
2678 protected void RegisterActionForSync( int part_id, int action_id )
2679 {
2680 m_InteractedPartId = part_id;
2681 m_PerformedActionId = action_id;
2682 }
2683
2684 protected void ResetActionSyncData()
2685 {
2686 //reset data
2687 m_InteractedPartId = -1;
2689 }
2690
2691 protected void SetActionFromSyncData()
2692 {
2693 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
2694 {
2696 int build_action_id = m_PerformedActionId;
2697
2698 switch( build_action_id )
2699 {
2700 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
2701 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
2702 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
2703 }
2704 }
2705 }
2706 //------
2707
2709 {
2710 string key = part.m_PartName;
2711 bool is_base = part.IsBase();
2712 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
2713 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
2714 if ( is_part_built_sync )
2715 {
2716 if ( !part.IsBuilt() )
2717 {
2718 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
2719 GetConstruction().AddToConstructedParts( key );
2720 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
2721
2722 if (is_base)
2723 {
2725 RemoveProxyPhysics( ANIMATION_DEPLOYED );
2726 }
2727 }
2728 }
2729 else
2730 {
2731 if ( part.IsBuilt() )
2732 {
2733 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
2734 GetConstruction().RemoveFromConstructedParts( key );
2735 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
2736
2737 if (is_base)
2738 {
2740 AddProxyPhysics( ANIMATION_DEPLOYED );
2741 }
2742 }
2743 }
2744
2745 //check slot lock for material attachments
2746 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
2747 }
2748
2749 //set construction parts based on synchronized data
2751 {
2752 Construction construction = GetConstruction();
2753 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2754
2755 for ( int i = 0; i < construction_parts.Count(); ++i )
2756 {
2757 string key = construction_parts.GetKey( i );
2758 ConstructionPart value = construction_parts.Get( key );
2759 SetPartFromSyncData(value);
2760 }
2761
2762 //regenerate navmesh
2763 UpdateNavmesh();
2764 }
2765
2766 protected ConstructionPart GetConstructionPartById( int id )
2767 {
2768 Construction construction = GetConstruction();
2769 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2770
2771 for ( int i = 0; i < construction_parts.Count(); ++i )
2772 {
2773 string key = construction_parts.GetKey( i );
2774 ConstructionPart value = construction_parts.Get( key );
2775
2776 if ( value.GetId() == id )
2777 {
2778 return value;
2779 }
2780 }
2781
2782 return NULL;
2783 }
2784 //
2785
2786 //Base
2787 bool HasBase()
2788 {
2789 return m_HasBase;
2790 }
2791
2792 void SetBaseState( bool has_base )
2793 {
2794 m_HasBase = has_base;
2795 }
2796
2797 override bool IsDeployable()
2798 {
2799 return true;
2800 }
2801
2802 bool IsOpened()
2803 {
2804 return false;
2805 }
2806
2807 //--- CONSTRUCTION KIT
2809 {
2810 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
2811 if ( m_ConstructionKitHealth > 0 )
2812 {
2813 construction_kit.SetHealth( m_ConstructionKitHealth );
2814 }
2815
2816 return construction_kit;
2817 }
2818
2819 void CreateConstructionKitInHands(notnull PlayerBase player)
2820 {
2821 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2822 if ( m_ConstructionKitHealth > 0 )
2823 {
2824 construction_kit.SetHealth( m_ConstructionKitHealth );
2825 }
2826 }
2827
2828 protected vector GetKitSpawnPosition()
2829 {
2830 return GetPosition();
2831 }
2832
2833 protected string GetConstructionKitType()
2834 {
2835 return "";
2836 }
2837
2838 void DestroyConstructionKit( ItemBase construction_kit )
2839 {
2840 m_ConstructionKitHealth = construction_kit.GetHealth();
2841 GetGame().ObjectDelete( construction_kit );
2842 }
2843
2844 //--- CONSTRUCTION
2845 void DestroyConstruction()
2846 {
2847 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2848 GetGame().ObjectDelete( this );
2849 }
2850
2851 // --- EVENTS
2852 override void OnStoreSave( ParamsWriteContext ctx )
2853 {
2854 super.OnStoreSave( ctx );
2855
2856 //sync parts 01
2857 ctx.Write( m_SyncParts01 );
2858 ctx.Write( m_SyncParts02 );
2859 ctx.Write( m_SyncParts03 );
2860
2861 ctx.Write( m_HasBase );
2862 }
2863
2864 override bool OnStoreLoad( ParamsReadContext ctx, int version )
2865 {
2866 if ( !super.OnStoreLoad( ctx, version ) )
2867 return false;
2868
2869 //--- Base building data ---
2870 //Restore synced parts data
2871 if ( !ctx.Read( m_SyncParts01 ) )
2872 {
2873 m_SyncParts01 = 0; //set default
2874 return false;
2875 }
2876 if ( !ctx.Read( m_SyncParts02 ) )
2877 {
2878 m_SyncParts02 = 0; //set default
2879 return false;
2880 }
2881 if ( !ctx.Read( m_SyncParts03 ) )
2882 {
2883 m_SyncParts03 = 0; //set default
2884 return false;
2885 }
2886
2887 //has base
2888 if ( !ctx.Read( m_HasBase ) )
2889 {
2890 m_HasBase = false;
2891 return false;
2892 }
2893 //---
2894
2895 return true;
2896 }
2897
2898 override void AfterStoreLoad()
2899 {
2900 super.AfterStoreLoad();
2901
2903 {
2905 }
2906 }
2907
2909 {
2910 //update server data
2912
2913 //set base state
2914 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
2915 SetBaseState( construction_part.IsBuilt() ) ;
2916
2917 //synchronize after load
2919 }
2920
2921 override void OnCreatePhysics()
2922 {
2923 super.OnCreatePhysics();
2926 }
2927
2928 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2929 {
2931 return;
2932
2933 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2934
2935 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
2936 return;
2937
2938 Construction construction = GetConstruction();
2939 string part_name = zone;
2940 part_name.ToLower();
2941
2942 if ( newLevel == GameConstants.STATE_RUINED )
2943 {
2944 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2945
2946 if ( construction_part && construction.IsPartConstructed( part_name ) )
2947 {
2948 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
2949 construction.DestroyConnectedParts(part_name);
2950 }
2951
2952 //barbed wire handling (hack-ish)
2953 if ( part_name.Contains("barbed") )
2954 {
2955 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2956 if (barbed_wire)
2957 barbed_wire.SetMountedState( false );
2958 }
2959 }
2960 }
2961
2962 override void EEOnAfterLoad()
2963 {
2965 {
2967 }
2968
2969 super.EEOnAfterLoad();
2970 }
2971
2972 override void EEInit()
2973 {
2974 super.EEInit();
2975
2976 // init visuals and physics
2977 InitBaseState();
2978
2979 //debug
2980 #ifdef DEVELOPER
2982 #endif
2983 }
2984
2985 override void EEItemAttached( EntityAI item, string slot_name )
2986 {
2987 super.EEItemAttached( item, slot_name );
2988
2989 CheckForHybridAttachments( item, slot_name );
2990 UpdateVisuals();
2991 UpdateAttachmentPhysics( slot_name, false );
2992 }
2993
2994 override void EEItemDetached( EntityAI item, string slot_name )
2995 {
2996 super.EEItemDetached( item, slot_name );
2997
2998 UpdateVisuals();
2999 UpdateAttachmentPhysics( slot_name, false );
3000 }
3001
3002 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
3003 {
3004 string slot_name = InventorySlots.GetSlotName( slotId );
3005 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
3006
3007 UpdateAttachmentVisuals( slot_name, locked );
3008 UpdateAttachmentPhysics( slot_name, locked );
3009 }
3010
3011 //ignore out of reach condition
3012 override bool IgnoreOutOfReachCondition()
3013 {
3014 return true;
3015 }
3016
3017 //CONSTRUCTION EVENTS
3018 //Build
3019 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
3020 {
3021 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
3022
3023 //check base state
3024 if (construtionPart.IsBase())
3025 {
3026 SetBaseState(true);
3027
3028 //spawn kit
3030 }
3031
3032 //register constructed parts for synchronization
3033 RegisterPartForSync(construtionPart.GetId());
3034
3035 //register action that was performed on part
3036 RegisterActionForSync(construtionPart.GetId(), action_id);
3037
3038 //synchronize
3040
3041 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
3042
3043 UpdateNavmesh();
3044
3045 //update visuals
3046 UpdateVisuals();
3047
3048 //reset action sync data
3050 }
3051
3052 void OnPartBuiltClient(string part_name, int action_id)
3053 {
3054 //play sound
3055 SoundBuildStart( part_name );
3056 }
3057
3058 //Dismantle
3059 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
3060 {
3061 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
3062 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
3063
3064 //register constructed parts for synchronization
3065 UnregisterPartForSync(construtionPart.GetId());
3066
3067 //register action that was performed on part
3068 RegisterActionForSync(construtionPart.GetId(), action_id);
3069
3070 //synchronize
3072
3073 // server part of sync, client will be synced from SetPartsFromSyncData
3074 SetPartFromSyncData(construtionPart);
3075
3076 UpdateNavmesh();
3077
3078 //update visuals
3079 UpdateVisuals();
3080
3081 //reset action sync data
3083
3084 //check base state
3085 if (construtionPart.IsBase())
3086 {
3087 //Destroy construction
3089 }
3090
3091 if (GetGame().IsServer())
3092 HandleItemFalling(construtionPart);
3093 }
3094
3095 void OnPartDismantledClient( string part_name, int action_id )
3096 {
3097 //play sound
3098 SoundDismantleStart( part_name );
3099 }
3100
3101 //Destroy
3102 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
3103 {
3104 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
3105 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
3106
3107 //register constructed parts for synchronization
3108 UnregisterPartForSync(construtionPart.GetId());
3109
3110 //register action that was performed on part
3111 RegisterActionForSync(construtionPart.GetId(), action_id);
3112
3113 //synchronize
3115
3116 // server part of sync, client will be synced from SetPartsFromSyncData
3117 SetPartFromSyncData(construtionPart);
3118
3119 UpdateNavmesh();
3120
3121 //update visuals
3122 UpdateVisuals();
3123
3124 //reset action sync data
3126
3127 //check base state
3128 if (construtionPart.IsBase())
3129 {
3130 //Destroy construction
3132 }
3133
3134 if (GetGame().IsServer())
3135 HandleItemFalling(construtionPart);
3136 }
3137
3138 void OnPartDestroyedClient( string part_name, int action_id )
3139 {
3140 //play sound
3141 SoundDestroyStart( part_name );
3142 }
3143
3144 protected void HandleItemFalling(ConstructionPart part)
3145 {
3146 bool process = false;
3147
3148 //TODO: add a parameter to parts' config classes?
3149 process |= part.m_PartName.Contains("_roof");
3150 process |= part.m_PartName.Contains("_platform");
3151 process |= part.m_PartName.Contains("_stair");
3152
3153 if (process)
3154 {
3155 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
3156 {
3157 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
3158 return;
3159 }
3160
3161 vector mins, maxs;
3162 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
3163 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
3164
3165 //sanitize minmaxs
3166 vector minTmp, maxTmp;
3167 minTmp[0] = Math.Min(mins[0],maxs[0]);
3168 maxTmp[0] = Math.Max(mins[0],maxs[0]);
3169 minTmp[1] = Math.Min(mins[1],maxs[1]);
3170 maxTmp[1] = Math.Max(mins[1],maxs[1]);
3171 minTmp[2] = Math.Min(mins[2],maxs[2]);
3172 maxTmp[2] = Math.Max(mins[2],maxs[2]);
3173 mins = minTmp;
3174 maxs = maxTmp;
3175
3176 maxs[1] = maxs[1] + 0.35; //reach a little above..
3177
3178 ItemFall(mins,maxs);
3179 }
3180 }
3181
3182 protected void ItemFall(vector min, vector max)
3183 {
3184 array<EntityAI> foundEntities = new array<EntityAI>();
3185 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
3186
3187 //filtering
3188 ItemBase item;
3189 foreach (EntityAI entity : foundEntities)
3190 {
3191 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
3192 item.ThrowPhysically(null,vector.Zero);
3193 }
3194 }
3195
3196 // --- UPDATE
3197 void InitBaseState()
3198 {
3199 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
3200
3201 InitVisuals();
3202 UpdateNavmesh(); //regenerate navmesh
3203 GetConstruction().InitBaseState();
3204 }
3205
3206 void InitVisuals()
3207 {
3208 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
3209 //check base
3210 if ( !HasBase() )
3211 {
3212 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
3213 }
3214 else
3215 {
3216 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
3217 }
3218
3219 GetConstruction().UpdateVisuals();
3220 }
3221
3222 void UpdateVisuals()
3223 {
3224 array<string> attachmentSlots = new array<string>;
3225
3226 GetAttachmentSlots(this, attachmentSlots);
3227 foreach (string slotName : attachmentSlots)
3228 {
3230 }
3231
3232 //check base
3233 if (!HasBase())
3234 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
3235 else
3236 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
3237
3238 GetConstruction().UpdateVisuals();
3239 }
3240
3241 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
3242 {
3243 string slotNameMounted = slot_name + "_Mounted";
3244 EntityAI attachment = FindAttachmentBySlotName(slot_name);
3245
3246 if (attachment)
3247 {
3248 BarbedWire barbedWire = BarbedWire.Cast(attachment);
3249 if (barbedWire && barbedWire.IsMounted())
3250 CreateAreaDamage(slotNameMounted);
3251 else
3252 DestroyAreaDamage(slotNameMounted);
3253
3254 if (is_locked)
3255 {
3256 SetAnimationPhase(slotNameMounted, 0);
3257 SetAnimationPhase(slot_name, 1);
3258 }
3259 else
3260 {
3261 SetAnimationPhase(slotNameMounted, 1);
3262 SetAnimationPhase(slot_name, 0);
3263 }
3264 }
3265 else
3266 {
3267 SetAnimationPhase(slotNameMounted, 1);
3268 SetAnimationPhase(slot_name, 1);
3269
3270 DestroyAreaDamage(slotNameMounted);
3271 }
3272 }
3273
3274 // avoid calling this function on frequent occasions, it's a massive performance hit
3275 void UpdatePhysics()
3276 {
3278 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
3279
3280 array<string> attachmentSlots = new array<string>;
3281 GetAttachmentSlots(this, attachmentSlots);
3282
3284 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
3285
3286 foreach (string slotName : attachmentSlots)
3287 {
3289 }
3290
3291 //check base
3292 if (!HasBase())
3293 {
3295 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
3296
3297 AddProxyPhysics(ANIMATION_DEPLOYED);
3298 }
3299 else
3300 {
3302 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
3303
3304 RemoveProxyPhysics(ANIMATION_DEPLOYED);
3305 }
3306
3307 GetConstruction().UpdatePhysics();
3308 UpdateNavmesh();
3309 }
3310
3311 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
3312 {
3313 //checks for invalid appends; hotfix
3314 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
3315 return;
3316 //----------------------------------
3317 string slot_name_mounted = slot_name + "_Mounted";
3318 EntityAI attachment = FindAttachmentBySlotName( slot_name );
3319
3320 //remove proxy physics
3321 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
3322 RemoveProxyPhysics( slot_name_mounted );
3323 RemoveProxyPhysics( slot_name );
3324
3325 if ( attachment )
3326 {
3327 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
3328 if ( is_locked )
3329 {
3330 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
3331 AddProxyPhysics( slot_name_mounted );
3332 }
3333 else
3334 {
3335 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
3336 AddProxyPhysics( slot_name );
3337 }
3338 }
3339 }
3340
3341 protected void UpdateNavmesh()
3342 {
3343 SetAffectPathgraph( true, false );
3344 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
3345 }
3346
3347 override bool CanUseConstruction()
3348 {
3349 return true;
3350 }
3351
3352 override bool CanUseConstructionBuild()
3353 {
3354 return true;
3355 }
3356
3357 protected bool IsAttachmentSlotLocked( EntityAI attachment )
3358 {
3359 if ( attachment )
3360 {
3361 InventoryLocation inventory_location = new InventoryLocation;
3362 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3363
3364 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
3365 }
3366
3367 return false;
3368 }
3369
3370 protected bool IsAttachmentSlotLocked( string slot_name )
3371 {
3372 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
3373 }
3374
3375 //--- ATTACHMENT SLOTS
3376 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
3377 {
3378 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3379 if ( GetGame().ConfigIsExisting( config_path ) )
3380 {
3381 GetGame().ConfigGetTextArray( config_path, attachment_slots );
3382 }
3383 }
3384
3385 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
3386 {
3387 return true;
3388 }
3389
3390 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
3391 {
3392 return true;
3393 }
3394
3395 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
3396 {
3397 return true;
3398 }
3399
3400 // --- INIT
3401 void ConstructionInit()
3402 {
3403 if ( !m_Construction )
3404 {
3405 m_Construction = new Construction( this );
3406 }
3407
3408 GetConstruction().Init();
3409 }
3410
3412 {
3413 return m_Construction;
3414 }
3415
3416 //--- INVENTORY/ATTACHMENTS CONDITIONS
3417 //attachments
3418 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
3419 {
3420 return super.CanReceiveAttachment(attachment, slotId);
3421 }
3422
3424 {
3425 int attachment_count = GetInventory().AttachmentCount();
3426 if ( attachment_count > 0 )
3427 {
3428 if ( HasBase() && attachment_count == 1 )
3429 {
3430 return false;
3431 }
3432
3433 return true;
3434 }
3435
3436 return false;
3437 }
3438
3439 override bool ShowZonesHealth()
3440 {
3441 return true;
3442 }
3443
3444 override bool IsTakeable()
3445 {
3446 return false;
3447 }
3448
3449 //this into/outo parent.Cargo
3450 override bool CanPutInCargo( EntityAI parent )
3451 {
3452 return false;
3453 }
3454
3455 override bool CanRemoveFromCargo( EntityAI parent )
3456 {
3457 return false;
3458 }
3459
3460 //hands
3461 override bool CanPutIntoHands( EntityAI parent )
3462 {
3463 return false;
3464 }
3465
3466 //--- ACTION CONDITIONS
3467 //direction
3468 override bool IsFacingPlayer( PlayerBase player, string selection )
3469 {
3470 return true;
3471 }
3472
3473 override bool IsPlayerInside( PlayerBase player, string selection )
3474 {
3475 return true;
3476 }
3477
3480 {
3481 return false;
3482 }
3483
3484 //camera direction check
3485 bool IsFacingCamera( string selection )
3486 {
3487 return true;
3488 }
3489
3490 //roof check
3491 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
3492 {
3493 return false;
3494 }
3495
3496 //selection->player distance check
3497 bool HasProperDistance( string selection, PlayerBase player )
3498 {
3499 return true;
3500 }
3501
3502 //folding
3504 {
3505 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
3506 {
3507 return false;
3508 }
3509
3510 return true;
3511 }
3512
3514 {
3517
3518 return item;
3519 }
3520
3521 //Damage triggers (barbed wire)
3522 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
3523 {
3524 if ( GetGame() && GetGame().IsServer() )
3525 {
3526 //destroy area damage if some already exists
3527 DestroyAreaDamage( slot_name );
3528
3529 //create new area damage
3531 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
3532
3533 vector min_max[2];
3534 if ( MemoryPointExists( slot_name + "_min" ) )
3535 {
3536 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3537 }
3538 if ( MemoryPointExists( slot_name + "_max" ) )
3539 {
3540 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3541 }
3542
3543 //get proper trigger extents (min<max)
3544 vector extents[2];
3545 GetConstruction().GetTriggerExtents( min_max, extents );
3546
3547 //get box center
3548 vector center;
3549 center = GetConstruction().GetBoxCenter( min_max );
3550 center = ModelToWorld( center );
3551
3552 //rotate center if needed
3553 vector orientation = GetOrientation();;
3554 CalcDamageAreaRotation( rotation_angle, center, orientation );
3555
3556 areaDamage.SetExtents( extents[0], extents[1] );
3557 areaDamage.SetAreaPosition( center );
3558 areaDamage.SetAreaOrientation( orientation );
3559 areaDamage.SetLoopInterval( 1.0 );
3560 areaDamage.SetDeferDuration( 0.2 );
3561 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3562 areaDamage.SetAmmoName( "BarbedWireHit" );
3563 areaDamage.Spawn();
3564
3565 m_DamageTriggers.Insert( slot_name, areaDamage );
3566 }
3567 }
3568
3569 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
3570 {
3571 if ( angle_deg != 0 )
3572 {
3573 //orientation
3574 orientation[0] = orientation[0] - angle_deg;
3575
3576 //center
3577 vector rotate_axis;
3578 if ( MemoryPointExists( "rotate_axis" ) )
3579 {
3580 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3581 }
3582 float r_center_x = ( Math.Cos( angle_deg * Math.DEG2RAD ) * ( center[0] - rotate_axis[0] ) ) - ( Math.Sin( angle_deg * Math.DEG2RAD ) * ( center[2] - rotate_axis[2] ) ) + rotate_axis[0];
3583 float r_center_z = ( Math.Sin( angle_deg * Math.DEG2RAD ) * ( center[0] - rotate_axis[0] ) ) + ( Math.Cos( angle_deg * Math.DEG2RAD ) * ( center[2] - rotate_axis[2] ) ) + rotate_axis[2];
3584 center[0] = r_center_x;
3585 center[2] = r_center_z;
3586 }
3587 }
3588
3589 void DestroyAreaDamage( string slot_name )
3590 {
3591 if (GetGame() && GetGame().IsServer())
3592 {
3594 if (m_DamageTriggers.Find(slot_name, areaDamage))
3595 {
3596 if (areaDamage)
3597 {
3598 areaDamage.Destroy();
3599 }
3600
3601 m_DamageTriggers.Remove( slot_name );
3602 }
3603 }
3604 }
3605
3606 override bool IsIgnoredByConstruction()
3607 {
3608 return true;
3609 }
3610
3611 //================================================================
3612 // SOUNDS
3613 //================================================================
3614 protected void SoundBuildStart( string part_name )
3615 {
3616 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
3617 }
3618
3619 protected void SoundDismantleStart( string part_name )
3620 {
3621 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3622 }
3623
3624 protected void SoundDestroyStart( string part_name )
3625 {
3626 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3627 }
3628
3629 protected string GetBuildSoundByMaterial( string part_name )
3630 {
3631 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3632
3633 switch ( material_type )
3634 {
3635 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
3636 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
3637 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
3638 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
3639 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
3640 }
3641
3642 return "";
3643 }
3644
3645 protected string GetDismantleSoundByMaterial( string part_name )
3646 {
3647 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3648
3649 switch ( material_type )
3650 {
3651 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
3652 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
3653 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
3654 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
3655 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
3656 }
3657
3658 return "";
3659 }
3660
3661 //misc
3662 void CheckForHybridAttachments( EntityAI item, string slot_name )
3663 {
3664 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
3665 {
3666 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
3667 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
3668 {
3669 SetHealth(slot_name,"Health",item.GetHealth());
3670 }
3671 }
3672 }
3673
3674 override int GetDamageSystemVersionChange()
3675 {
3676 return 111;
3677 }
3678
3679 override void SetActions()
3680 {
3681 super.SetActions();
3682
3686 }
3687
3688 //================================================================
3689 // DEBUG
3690 //================================================================
3691 protected void DebugCustomState()
3692 {
3693 }
3694
3697 {
3698 return null;
3699 }
3700
3701 override void OnDebugSpawn()
3702 {
3703 FullyBuild();
3704 }
3705
3706 void FullyBuild()
3707 {
3709 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
3710
3711 Man p;
3712
3713 #ifdef SERVER
3714 array<Man> players = new array<Man>;
3715 GetGame().GetWorld().GetPlayerList(players);
3716 if (players.Count())
3717 p = players[0];
3718 #else
3719 p = GetGame().GetPlayer();
3720 #endif
3721
3722 foreach (ConstructionPart part : parts)
3723 {
3724 bool excluded = false;
3725 string partName = part.GetPartName();
3726 if (excludes)
3727 {
3728 foreach (string exclude : excludes)
3729 {
3730 if (partName.Contains(exclude))
3731 {
3732 excluded = true;
3733 break;
3734 }
3735 }
3736 }
3737
3738 if (!excluded)
3739 {
3740 OnPartBuiltServer(p, partName, AT_BUILD_PART);
3741 }
3742 }
3743
3744 GetConstruction().UpdateVisuals();
3745 }
3746}
3747
3748void bsbDebugPrint (string s)
3749{
3750#ifdef BSB_DEBUG
3751 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3752#else
3753 //Print("" + s); // comment/uncomment to hide/see debug logs
3754#endif
3755}
3756void bsbDebugSpam (string s)
3757{
3758#ifdef BSB_DEBUG_SPAM
3759 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3760#else
3761 //Print("" + s); // comment/uncomment to hide/see debug logs
3762#endif
3763}
const int AT_DISMANTLE_PART
Определения _constants.c:7
const int AT_DESTROY_PART
Определения _constants.c:8
const int AT_BUILD_PART
Определения _constants.c:6
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
vector GetOrientation()
Определения AreaDamageManager.c:306
void AreaDamageManager(EntityAI parent)
Определения AreaDamageManager.c:22
void OnPartDismantledClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1928
const string ANIMATION_DEPLOYED
Определения BaseBuildingBase.c:1293
override int GetHideIconMask()
Определения BaseBuildingBase.c:1378
override void OnStoreSave(ParamsWriteContext ctx)
Определения BaseBuildingBase.c:1685
void FullyBuild()
Определения BaseBuildingBase.c:2539
void UpdateVisuals()
Определения BaseBuildingBase.c:2055
void SetActionFromSyncData()
Определения BaseBuildingBase.c:1524
int m_SyncParts01
Определения BaseBuildingBase.c:1301
void UpdateNavmesh()
Определения BaseBuildingBase.c:2174
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2223
override void OnDebugSpawn()
Определения BaseBuildingBase.c:2534
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения BaseBuildingBase.c:2529
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:2457
const string SOUND_BUILD_WOOD_LOG
Определения BaseBuildingBase.c:1309
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:2447
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2074
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:2402
override bool CanObstruct()
Определения BaseBuildingBase.c:1373
bool HasAttachmentsBesidesBase()
Определения BaseBuildingBase.c:2256
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1413
const string SOUND_DISMANTLE_METAL
Определения BaseBuildingBase.c:1318
void InitBaseState()
Определения BaseBuildingBase.c:2030
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:2251
void BaseBuildingBase()
Определения BaseBuildingBase.c:1328
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:1741
void DestroyConstruction()
Определения BaseBuildingBase.c:1678
ref array< string > m_HybridAttachments
Определения BaseBuildingBase.c:1324
int m_InteractedPartId
Определения BaseBuildingBase.c:1304
bool m_HasBase
Определения BaseBuildingBase.c:1299
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2478
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:2190
void UpdatePhysics()
Определения BaseBuildingBase.c:2108
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2301
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1885
bool HasProperDistance(string selection, PlayerBase player)
Определения BaseBuildingBase.c:2330
override void OnCreatePhysics()
Определения BaseBuildingBase.c:1754
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1852
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:1511
const string SOUND_BUILD_WOOD_PLANK
Определения BaseBuildingBase.c:1310
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:1583
ref array< string > m_Mountables
Определения BaseBuildingBase.c:1325
const string SOUND_BUILD_WIRE
Определения BaseBuildingBase.c:1313
int m_SyncParts03
Определения BaseBuildingBase.c:1303
void ResetActionSyncData()
Определения BaseBuildingBase.c:1517
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:1368
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1892
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:2495
override void EEOnAfterLoad()
Определения BaseBuildingBase.c:1795
override void EEItemDetached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1827
vector GetKitSpawnPosition()
Определения BaseBuildingBase.c:1661
ref Construction m_Construction
Определения BaseBuildingBase.c:1297
bool IsFacingCamera(string selection)
Определения BaseBuildingBase.c:2318
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
Определения BaseBuildingBase.c:2218
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:2209
override bool IsDeployable()
Определения BaseBuildingBase.c:1630
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1971
override void EEInit()
Определения BaseBuildingBase.c:1805
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1442
void bsbDebugSpam(string s)
Определения BaseBuildingBase.c:1300
override void OnVariablesSynchronized()
Определения BaseBuildingBase.c:1392
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения BaseBuildingBase.c:2324
Construction GetConstruction()
Определения BaseBuildingBase.c:2244
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:2452
void DebugCustomState()
Определения BaseBuildingBase.c:2524
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:1599
string GetConstructionKitType()
Определения BaseBuildingBase.c:1666
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2228
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения BaseBuildingBase.c:1935
bool CanFoldBaseBuildingObject()
Определения BaseBuildingBase.c:2336
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:2507
const string SOUND_DISMANTLE_WOOD_PLANK
Определения BaseBuildingBase.c:1316
override void EEItemAttached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1818
const string SOUND_DISMANTLE_WOOD_LOG
Определения BaseBuildingBase.c:1315
void InitVisuals()
Определения BaseBuildingBase.c:2039
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
Определения BaseBuildingBase.c:1292
const string SOUND_BUILD_WOOD_STAIRS
Определения BaseBuildingBase.c:1311
ItemBase FoldBaseBuildingObject()
Определения BaseBuildingBase.c:2346
override bool CanPutInCargo(EntityAI parent)
Определения BaseBuildingBase.c:2283
override bool CanUseConstruction()
Определения BaseBuildingBase.c:2180
override void AfterStoreLoad()
Определения BaseBuildingBase.c:1731
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:1541
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:1761
override bool IgnoreOutOfReachCondition()
Определения BaseBuildingBase.c:1845
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BaseBuildingBase.c:1697
override bool ShowZonesHealth()
Определения BaseBuildingBase.c:2272
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2144
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2306
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2462
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:1641
const string SOUND_DISMANTLE_WIRE
Определения BaseBuildingBase.c:1319
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
Определения BaseBuildingBase.c:2312
override bool IsTakeable()
Определения BaseBuildingBase.c:2277
float m_ConstructionKitHealth
Определения BaseBuildingBase.c:1295
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:1357
override void SetActions()
Определения BaseBuildingBase.c:2512
void HandleItemFalling(ConstructionPart part)
Определения BaseBuildingBase.c:1977
void DestroyConstructionKit(ItemBase construction_kit)
Определения BaseBuildingBase.c:1671
void CreateConstructionKitInHands(notnull PlayerBase player)
Определения BaseBuildingBase.c:1652
bool IsOpened()
Определения BaseBuildingBase.c:1635
void ItemFall(vector min, vector max)
Определения BaseBuildingBase.c:2015
int m_PerformedActionId
Определения BaseBuildingBase.c:1305
override bool CanUseConstructionBuild()
Определения BaseBuildingBase.c:2185
bool HasBase()
Определения BaseBuildingBase.c:1620
void OnSynchronizedClient()
Определения BaseBuildingBase.c:1400
void SynchronizeBaseState()
Определения BaseBuildingBase.c:1384
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:2439
ref map< string, ref AreaDamageManager > m_DamageTriggers
Определения BaseBuildingBase.c:1323
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:1625
const string SOUND_BUILD_METAL
Определения BaseBuildingBase.c:1312
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
Определения BaseBuildingBase.c:1835
override bool CanPutIntoHands(EntityAI parent)
Определения BaseBuildingBase.c:2294
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:1471
override bool CanRemoveFromCargo(EntityAI parent)
Определения BaseBuildingBase.c:2288
void ConstructionInit()
Определения BaseBuildingBase.c:2234
int m_SyncParts02
Определения BaseBuildingBase.c:1302
const string SOUND_DISMANTLE_WOOD_STAIRS
Определения BaseBuildingBase.c:1317
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
PlayerSpawnPreset slotName
ConstructionMaterialType
Определения Construction.c:2
void Construction(BaseBuildingBase parent)
Определения Construction.c:26
map
Определения ControlsXboxNew.c:4
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
void DestroyAreaDamage()
Определения FireplaceBase.c:2338
void CreateAreaDamage()
Определения FireplaceBase.c:2322
EffectSound m_Sound
Определения HungerSoundHandler.c:18
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
Определения ActionTakeItem.c:7
const int HITZONE
Определения AreaDamageManager.c:4
override void SetLoopInterval(float time)
Определения AreaDamageLooped.c:32
A particular version of the deferred loop used to not damage players inside vehicles.
override void SetDeferDuration(float time)
Определения AreaDamageLoopedDeferred.c:7
proto native World GetWorld()
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void ObjectDelete(Object obj)
Super root of all classes in Enforce script.
Определения EnScript.c:11
int GetId()
Определения ConstructionPart.c:40
string GetPartName()
Определения ConstructionPart.c:30
bool IsBase()
Определения ConstructionPart.c:65
bool IsBuilt()
Определения ConstructionPart.c:45
string m_PartName
Определения ConstructionPart.c:5
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения Debug.c:122
Определения Debug.c:2
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
Определения Building.c:6
Определения constants.c:659
proto native int GetSlot()
returns slot id if current type is Attachment
InventoryLocation.
Определения InventoryLocation.c:29
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
Определения InventorySlots.c:6
override bool CanUseConstruction()
Определения BaseBuildingBase.c:891
Определения InventoryItem.c:731
static bool IsBaseBuildingLogEnable()
Определения Debug.c:698
Определения Debug.c:594
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native void GetPlayerList(out array< Man > players)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static const vector Zero
Определения EnConvert.c:110
Определения EnConvert.c:106
override string GetDebugName()
Определения dayzplayer.c:1170
Serializer ParamsReadContext
Определения gameplay.c:15
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const int STATE_RUINED
Определения constants.c:846
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto float Cos(float angle)
Returns cosinus of angle in radians.
static proto float Sin(float angle)
Returns sinus of angle in radians.
static const float DEG2RAD
Определения EnMath.c:17
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
proto int ToLower()
Changes string to lowercase. Returns length.
const int CALL_CATEGORY_GAMEPLAY
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8

Используется в ItemBase::OnPartDestroyedClient().