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

◆ SoundDismantleStart()

void bsbDebugPrint::SoundDismantleStart ( string part_name)
protected

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

2494{
2495 const string ANIMATION_DEPLOYED = "Deployed";
2496
2497 float m_ConstructionKitHealth; //stored health value for used construction kit
2498
2500
2501 bool m_HasBase;
2502 //variables for synchronization of base building parts (2x31 is the current limit)
2503 int m_SyncParts01; //synchronization for already built parts (31 parts)
2504 int m_SyncParts02; //synchronization for already built parts (+31 parts)
2505 int m_SyncParts03; //synchronization for already built parts (+31 parts)
2506 int m_InteractedPartId; //construction part id that an action was performed on
2507 int m_PerformedActionId; //action id that was performed on a construction part
2508
2509 //Sounds
2510 //build
2511 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
2512 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
2513 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
2514 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
2515 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
2516 //dismantle
2517 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
2518 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
2519 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
2520 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
2521 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
2522
2523 protected EffectSound m_Sound;
2524
2528
2529 // Constructor
2530 void BaseBuildingBase()
2531 {
2533
2534 //synchronized variables
2535 RegisterNetSyncVariableInt( "m_SyncParts01" );
2536 RegisterNetSyncVariableInt( "m_SyncParts02" );
2537 RegisterNetSyncVariableInt( "m_SyncParts03" );
2538 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2539 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2540 RegisterNetSyncVariableBool( "m_HasBase" );
2541
2542 //Construction init
2544
2545 if (ConfigIsExisting("hybridAttachments"))
2546 {
2548 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
2549 }
2550 if (ConfigIsExisting("mountables"))
2551 {
2553 ConfigGetTextArray("mountables", m_Mountables);
2554 }
2555
2556 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
2557 }
2558
2559 override void EEDelete(EntityAI parent)
2560 {
2561 super.EEDelete(parent);
2562
2563 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
2564 {
2565 areaDamage.Destroy();
2566 }
2567
2568 }
2569
2570 override string GetInvulnerabilityTypeString()
2571 {
2572 return "disableBaseDamage";
2573 }
2574
2575 override bool CanObstruct()
2576 {
2577 return true;
2578 }
2579
2580 override int GetHideIconMask()
2581 {
2582 return EInventoryIconVisibility.HIDE_VICINITY;
2583 }
2584
2585 override void InitItemSounds()
2586 {
2587 super.InitItemSounds();
2588
2590 SoundParameters params = new SoundParameters();
2591 params.m_Loop = true;
2592
2593 if (GetFoldSoundset() != string.Empty)
2594 handler.AddSound(SoundConstants.ITEM_FOLD, GetFoldSoundset());
2595 if (GetLoopFoldSoundset() != string.Empty)
2596 handler.AddSound(SoundConstants.ITEM_FOLD_LOOP, GetLoopFoldSoundset(), params);
2597 }
2598
2599 override string GetFoldSoundset()
2600 {
2601 return "putDown_FenceKit_SoundSet";
2602 }
2603
2604 override string GetLoopFoldSoundset()
2605 {
2606 return "Shelter_Site_Build_Loop_SoundSet";
2607 }
2608
2609 // --- SYNCHRONIZATION
2611 {
2612 if ( GetGame().IsServer() )
2613 {
2614 SetSynchDirty();
2615 }
2616 }
2617
2618 override void OnVariablesSynchronized()
2619 {
2620 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
2621 super.OnVariablesSynchronized();
2622
2624 }
2625
2626 protected void OnSynchronizedClient()
2627 {
2628 //update parts
2630
2631 //update action on part
2633
2634 //update visuals (client)
2635 UpdateVisuals();
2636 }
2637
2638 //parts synchronization
2639 void RegisterPartForSync( int part_id )
2640 {
2641 //part_id must starts from index = 1
2642 int offset;
2643 int mask;
2644
2645 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2646 {
2647 offset = part_id - 1;
2648 mask = 1 << offset;
2649
2650 m_SyncParts01 = m_SyncParts01 | mask;
2651 }
2652 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2653 {
2654 offset = ( part_id % 32 );
2655 mask = 1 << offset;
2656
2657 m_SyncParts02 = m_SyncParts02 | mask;
2658 }
2659 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2660 {
2661 offset = ( part_id % 63 );
2662 mask = 1 << offset;
2663
2664 m_SyncParts03 = m_SyncParts03 | mask;
2665 }
2666 }
2667
2668 void UnregisterPartForSync( int part_id )
2669 {
2670 //part_id must starts from index = 1
2671 int offset;
2672 int mask;
2673
2674 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2675 {
2676 offset = part_id - 1;
2677 mask = 1 << offset;
2678
2679 m_SyncParts01 = m_SyncParts01 & ~mask;
2680 }
2681 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2682 {
2683 offset = ( part_id % 32 );
2684 mask = 1 << offset;
2685
2686 m_SyncParts02 = m_SyncParts02 & ~mask;
2687 }
2688 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2689 {
2690 offset = ( part_id % 63 );
2691 mask = 1 << offset;
2692
2693 m_SyncParts03 = m_SyncParts03 & ~mask;
2694 }
2695 }
2696
2697 bool IsPartBuildInSyncData( int part_id )
2698 {
2699 //part_id must starts from index = 1
2700 int offset;
2701 int mask;
2702
2703 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2704 {
2705 offset = part_id - 1;
2706 mask = 1 << offset;
2707
2708 if ( ( m_SyncParts01 & mask ) > 0 )
2709 {
2710 return true;
2711 }
2712 }
2713 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2714 {
2715 offset = ( part_id % 32 );
2716 mask = 1 << offset;
2717
2718 if ( ( m_SyncParts02 & mask ) > 0 )
2719 {
2720 return true;
2721 }
2722 }
2723 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2724 {
2725 offset = ( part_id % 63 );
2726 mask = 1 << offset;
2727
2728 if ( ( m_SyncParts03 & mask ) > 0 )
2729 {
2730 return true;
2731 }
2732 }
2733
2734 return false;
2735 }
2736
2737 protected void RegisterActionForSync( int part_id, int action_id )
2738 {
2739 m_InteractedPartId = part_id;
2740 m_PerformedActionId = action_id;
2741 }
2742
2743 protected void ResetActionSyncData()
2744 {
2745 //reset data
2746 m_InteractedPartId = -1;
2748 }
2749
2750 protected void SetActionFromSyncData()
2751 {
2752 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
2753 {
2755 int build_action_id = m_PerformedActionId;
2756
2757 switch( build_action_id )
2758 {
2759 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
2760 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
2761 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
2762 }
2763 }
2764 }
2765 //------
2766
2768 {
2769 string key = part.m_PartName;
2770 bool is_base = part.IsBase();
2771 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
2772 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
2773 if ( is_part_built_sync )
2774 {
2775 if ( !part.IsBuilt() )
2776 {
2777 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
2778 GetConstruction().AddToConstructedParts( key );
2779 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
2780
2781 if (is_base)
2782 {
2784 RemoveProxyPhysics( ANIMATION_DEPLOYED );
2785 }
2786 }
2787 }
2788 else
2789 {
2790 if ( part.IsBuilt() )
2791 {
2792 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
2793 GetConstruction().RemoveFromConstructedParts( key );
2794 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
2795
2796 if (is_base)
2797 {
2799 AddProxyPhysics( ANIMATION_DEPLOYED );
2800 }
2801 }
2802 }
2803
2804 //check slot lock for material attachments
2805 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
2806 }
2807
2808 //set construction parts based on synchronized data
2810 {
2811 Construction construction = GetConstruction();
2812 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2813
2814 for ( int i = 0; i < construction_parts.Count(); ++i )
2815 {
2816 string key = construction_parts.GetKey( i );
2817 ConstructionPart value = construction_parts.Get( key );
2818 SetPartFromSyncData(value);
2819 }
2820
2821 //regenerate navmesh
2822 UpdateNavmesh();
2823 }
2824
2825 protected ConstructionPart GetConstructionPartById( int id )
2826 {
2827 Construction construction = GetConstruction();
2828 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2829
2830 for ( int i = 0; i < construction_parts.Count(); ++i )
2831 {
2832 string key = construction_parts.GetKey( i );
2833 ConstructionPart value = construction_parts.Get( key );
2834
2835 if ( value.GetId() == id )
2836 {
2837 return value;
2838 }
2839 }
2840
2841 return NULL;
2842 }
2843 //
2844
2845 //Base
2846 bool HasBase()
2847 {
2848 return m_HasBase;
2849 }
2850
2851 void SetBaseState( bool has_base )
2852 {
2853 m_HasBase = has_base;
2854 }
2855
2856 override bool IsDeployable()
2857 {
2858 return true;
2859 }
2860
2861 bool IsOpened()
2862 {
2863 return false;
2864 }
2865
2866 //--- CONSTRUCTION KIT
2868 {
2869 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
2870 if ( m_ConstructionKitHealth > 0 )
2871 {
2872 construction_kit.SetHealth( m_ConstructionKitHealth );
2873 }
2874
2875 return construction_kit;
2876 }
2877
2878 void CreateConstructionKitInHands(notnull PlayerBase player)
2879 {
2880 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2881 if ( m_ConstructionKitHealth > 0 )
2882 {
2883 construction_kit.SetHealth( m_ConstructionKitHealth );
2884 }
2885 }
2886
2887 protected vector GetKitSpawnPosition()
2888 {
2889 return GetPosition();
2890 }
2891
2892 protected string GetConstructionKitType()
2893 {
2894 return "";
2895 }
2896
2897 void DestroyConstructionKit( ItemBase construction_kit )
2898 {
2899 m_ConstructionKitHealth = construction_kit.GetHealth();
2900 GetGame().ObjectDelete( construction_kit );
2901 }
2902
2903 //--- CONSTRUCTION
2904 void DestroyConstruction()
2905 {
2906 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2907 GetGame().ObjectDelete( this );
2908 }
2909
2910 // --- EVENTS
2911 override void OnStoreSave( ParamsWriteContext ctx )
2912 {
2913 super.OnStoreSave( ctx );
2914
2915 //sync parts 01
2916 ctx.Write( m_SyncParts01 );
2917 ctx.Write( m_SyncParts02 );
2918 ctx.Write( m_SyncParts03 );
2919
2920 ctx.Write( m_HasBase );
2921 }
2922
2923 override bool OnStoreLoad( ParamsReadContext ctx, int version )
2924 {
2925 if ( !super.OnStoreLoad( ctx, version ) )
2926 return false;
2927
2928 //--- Base building data ---
2929 //Restore synced parts data
2930 if ( !ctx.Read( m_SyncParts01 ) )
2931 {
2932 m_SyncParts01 = 0; //set default
2933 return false;
2934 }
2935 if ( !ctx.Read( m_SyncParts02 ) )
2936 {
2937 m_SyncParts02 = 0; //set default
2938 return false;
2939 }
2940 if ( !ctx.Read( m_SyncParts03 ) )
2941 {
2942 m_SyncParts03 = 0; //set default
2943 return false;
2944 }
2945
2946 //has base
2947 if ( !ctx.Read( m_HasBase ) )
2948 {
2949 m_HasBase = false;
2950 return false;
2951 }
2952 //---
2953
2954 return true;
2955 }
2956
2957 override void AfterStoreLoad()
2958 {
2959 super.AfterStoreLoad();
2960
2962 {
2964 }
2965 }
2966
2968 {
2969 //update server data
2971
2972 //set base state
2973 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
2974 SetBaseState( construction_part.IsBuilt() ) ;
2975
2976 //synchronize after load
2978 }
2979
2980 override void OnCreatePhysics()
2981 {
2982 super.OnCreatePhysics();
2985 }
2986
2987 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2988 {
2990 return;
2991
2992 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2993
2994 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
2995 return;
2996
2997 Construction construction = GetConstruction();
2998 string part_name = zone;
2999 part_name.ToLower();
3000
3001 if ( newLevel == GameConstants.STATE_RUINED )
3002 {
3003 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
3004
3005 if ( construction_part && construction.IsPartConstructed( part_name ) )
3006 {
3007 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
3008 construction.DestroyConnectedParts(part_name);
3009 }
3010
3011 //barbed wire handling (hack-ish)
3012 if ( part_name.Contains("barbed") )
3013 {
3014 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
3015 if (barbed_wire)
3016 barbed_wire.SetMountedState( false );
3017 }
3018 }
3019 }
3020
3021 override void EEOnAfterLoad()
3022 {
3024 {
3026 }
3027
3028 super.EEOnAfterLoad();
3029 }
3030
3031 override void EEInit()
3032 {
3033 super.EEInit();
3034
3035 // init visuals and physics
3036 InitBaseState();
3037
3038 //debug
3039 #ifdef DEVELOPER
3041 #endif
3042 }
3043
3044 override void EEItemAttached( EntityAI item, string slot_name )
3045 {
3046 super.EEItemAttached( item, slot_name );
3047
3048 CheckForHybridAttachments( item, slot_name );
3049 UpdateVisuals();
3050 UpdateAttachmentPhysics( slot_name, false );
3051 }
3052
3053 override void EEItemDetached( EntityAI item, string slot_name )
3054 {
3055 super.EEItemDetached( item, slot_name );
3056
3057 UpdateVisuals();
3058 UpdateAttachmentPhysics( slot_name, false );
3059 }
3060
3061 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
3062 {
3063 string slot_name = InventorySlots.GetSlotName( slotId );
3064 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
3065
3066 UpdateAttachmentVisuals( slot_name, locked );
3067 UpdateAttachmentPhysics( slot_name, locked );
3068 }
3069
3070 //ignore out of reach condition
3071 override bool IgnoreOutOfReachCondition()
3072 {
3073 return true;
3074 }
3075
3076 //CONSTRUCTION EVENTS
3077 //Build
3078 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
3079 {
3080 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
3081
3082 //check base state
3083 if (construtionPart.IsBase())
3084 {
3085 SetBaseState(true);
3086
3087 //spawn kit
3089 }
3090
3091 //register constructed parts for synchronization
3092 RegisterPartForSync(construtionPart.GetId());
3093
3094 //register action that was performed on part
3095 RegisterActionForSync(construtionPart.GetId(), action_id);
3096
3097 //synchronize
3099
3100 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
3101
3102 UpdateNavmesh();
3103
3104 //update visuals
3105 UpdateVisuals();
3106
3107 //reset action sync data
3109 }
3110
3111 void OnPartBuiltClient(string part_name, int action_id)
3112 {
3113 //play sound
3114 SoundBuildStart( part_name );
3115 }
3116
3117 //Dismantle
3118 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
3119 {
3120 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
3121 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
3122
3123 //register constructed parts for synchronization
3124 UnregisterPartForSync(construtionPart.GetId());
3125
3126 //register action that was performed on part
3127 RegisterActionForSync(construtionPart.GetId(), action_id);
3128
3129 //synchronize
3131
3132 // server part of sync, client will be synced from SetPartsFromSyncData
3133 SetPartFromSyncData(construtionPart);
3134
3135 UpdateNavmesh();
3136
3137 //update visuals
3138 UpdateVisuals();
3139
3140 //reset action sync data
3142
3143 //check base state
3144 if (construtionPart.IsBase())
3145 {
3146 //Destroy construction
3148 }
3149 }
3150
3151 void OnPartDismantledClient( string part_name, int action_id )
3152 {
3153 //play sound
3154 SoundDismantleStart( part_name );
3155 }
3156
3157 //Destroy
3158 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
3159 {
3160 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
3161 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
3162
3163 //register constructed parts for synchronization
3164 UnregisterPartForSync(construtionPart.GetId());
3165
3166 //register action that was performed on part
3167 RegisterActionForSync(construtionPart.GetId(), action_id);
3168
3169 //synchronize
3171
3172 // server part of sync, client will be synced from SetPartsFromSyncData
3173 SetPartFromSyncData(construtionPart);
3174
3175 UpdateNavmesh();
3176
3177 //update visuals
3178 UpdateVisuals();
3179
3180 //reset action sync data
3182
3183 //check base state
3184 if (construtionPart.IsBase())
3185 {
3186 //Destroy construction
3188 }
3189 }
3190
3191 void OnPartDestroyedClient( string part_name, int action_id )
3192 {
3193 //play sound
3194 SoundDestroyStart( part_name );
3195 }
3196
3198 protected void HandleItemFalling(ConstructionPart part)
3199 {
3200 bool process = false;
3201
3202 //TODO: add a parameter to parts' config classes?
3203 process |= part.m_PartName.Contains("_roof");
3204 process |= part.m_PartName.Contains("_platform");
3205 process |= part.m_PartName.Contains("_stair");
3206
3207 if (process)
3208 {
3209 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
3210 {
3211 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
3212 return;
3213 }
3214
3215 vector mins, maxs;
3216 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
3217 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
3218
3219 //sanitize minmaxs
3220 vector minTmp, maxTmp;
3221 minTmp[0] = Math.Min(mins[0],maxs[0]);
3222 maxTmp[0] = Math.Max(mins[0],maxs[0]);
3223 minTmp[1] = Math.Min(mins[1],maxs[1]);
3224 maxTmp[1] = Math.Max(mins[1],maxs[1]);
3225 minTmp[2] = Math.Min(mins[2],maxs[2]);
3226 maxTmp[2] = Math.Max(mins[2],maxs[2]);
3227 mins = minTmp;
3228 maxs = maxTmp;
3229
3230 maxs[1] = maxs[1] + 0.35; //reach a little above..
3231
3232 ItemFall(mins,maxs);
3233 }
3234 }
3235
3237 protected void ItemFall(vector min, vector max)
3238 {
3239 array<EntityAI> foundEntities = new array<EntityAI>();
3240 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
3241
3242 //filtering
3243 ItemBase item;
3244 foreach (EntityAI entity : foundEntities)
3245 {
3246 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
3247 item.ThrowPhysically(null,vector.Zero);
3248 }
3249 }
3250
3251 // --- UPDATE
3252 void InitBaseState()
3253 {
3254 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
3255
3256 InitVisuals();
3257 UpdateNavmesh(); //regenerate navmesh
3258 GetConstruction().InitBaseState();
3259 }
3260
3261 void InitVisuals()
3262 {
3263 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
3264 //check base
3265 if ( !HasBase() )
3266 {
3267 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
3268 }
3269 else
3270 {
3271 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
3272 }
3273
3274 GetConstruction().UpdateVisuals();
3275 }
3276
3277 void UpdateVisuals()
3278 {
3279 array<string> attachmentSlots = new array<string>;
3280
3281 GetAttachmentSlots(this, attachmentSlots);
3282 foreach (string slotName : attachmentSlots)
3283 {
3285 }
3286
3287 //check base
3288 if (!HasBase())
3289 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
3290 else
3291 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
3292
3293 GetConstruction().UpdateVisuals();
3294 }
3295
3296 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
3297 {
3298 string slotNameMounted = slot_name + "_Mounted";
3299 EntityAI attachment = FindAttachmentBySlotName(slot_name);
3300
3301 if (attachment)
3302 {
3303 BarbedWire barbedWire = BarbedWire.Cast(attachment);
3304 if (barbedWire && barbedWire.IsMounted())
3305 CreateAreaDamage(slotNameMounted);
3306 else
3307 DestroyAreaDamage(slotNameMounted);
3308
3309 if (is_locked)
3310 {
3311 SetAnimationPhase(slotNameMounted, 0);
3312 SetAnimationPhase(slot_name, 1);
3313 }
3314 else
3315 {
3316 SetAnimationPhase(slotNameMounted, 1);
3317 SetAnimationPhase(slot_name, 0);
3318 }
3319 }
3320 else
3321 {
3322 SetAnimationPhase(slotNameMounted, 1);
3323 SetAnimationPhase(slot_name, 1);
3324
3325 DestroyAreaDamage(slotNameMounted);
3326 }
3327 }
3328
3329 // avoid calling this function on frequent occasions, it's a massive performance hit
3330 void UpdatePhysics()
3331 {
3333 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
3334
3335 array<string> attachmentSlots = new array<string>;
3336 GetAttachmentSlots(this, attachmentSlots);
3337
3339 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
3340
3341 foreach (string slotName : attachmentSlots)
3342 {
3344 }
3345
3346 //check base
3347 if (!HasBase())
3348 {
3350 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
3351
3352 AddProxyPhysics(ANIMATION_DEPLOYED);
3353 }
3354 else
3355 {
3357 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
3358
3359 RemoveProxyPhysics(ANIMATION_DEPLOYED);
3360 }
3361
3362 GetConstruction().UpdatePhysics();
3363 UpdateNavmesh();
3364 }
3365
3366 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
3367 {
3368 //checks for invalid appends; hotfix
3369 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
3370 return;
3371 //----------------------------------
3372 string slot_name_mounted = slot_name + "_Mounted";
3373 EntityAI attachment = FindAttachmentBySlotName( slot_name );
3374
3375 //remove proxy physics
3376 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
3377 RemoveProxyPhysics( slot_name_mounted );
3378 RemoveProxyPhysics( slot_name );
3379
3380 if ( attachment )
3381 {
3382 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
3383 if ( is_locked )
3384 {
3385 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
3386 AddProxyPhysics( slot_name_mounted );
3387 }
3388 else
3389 {
3390 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
3391 AddProxyPhysics( slot_name );
3392 }
3393 }
3394 }
3395
3396 protected void UpdateNavmesh()
3397 {
3398 SetAffectPathgraph( true, false );
3399 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
3400 }
3401
3402 override bool CanUseConstruction()
3403 {
3404 return true;
3405 }
3406
3407 override bool CanUseConstructionBuild()
3408 {
3409 return true;
3410 }
3411
3412 protected bool IsAttachmentSlotLocked( EntityAI attachment )
3413 {
3414 if ( attachment )
3415 {
3416 InventoryLocation inventory_location = new InventoryLocation;
3417 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3418
3419 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
3420 }
3421
3422 return false;
3423 }
3424
3425 protected bool IsAttachmentSlotLocked( string slot_name )
3426 {
3427 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
3428 }
3429
3430 //--- ATTACHMENT SLOTS
3431 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
3432 {
3433 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3434 if ( GetGame().ConfigIsExisting( config_path ) )
3435 {
3436 GetGame().ConfigGetTextArray( config_path, attachment_slots );
3437 }
3438 }
3439
3440 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
3441 {
3442 return true;
3443 }
3444
3445 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
3446 {
3447 return true;
3448 }
3449
3450 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
3451 {
3452 return true;
3453 }
3454
3455 // --- INIT
3456 void ConstructionInit()
3457 {
3458 if ( !m_Construction )
3459 {
3460 m_Construction = new Construction( this );
3461 }
3462
3463 GetConstruction().Init();
3464 }
3465
3467 {
3468 return m_Construction;
3469 }
3470
3471 //--- INVENTORY/ATTACHMENTS CONDITIONS
3472 //attachments
3473 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
3474 {
3475 return super.CanReceiveAttachment(attachment, slotId);
3476 }
3477
3479 {
3480 int attachment_count = GetInventory().AttachmentCount();
3481 if ( attachment_count > 0 )
3482 {
3483 if ( HasBase() && attachment_count == 1 )
3484 {
3485 return false;
3486 }
3487
3488 return true;
3489 }
3490
3491 return false;
3492 }
3493
3494 override bool ShowZonesHealth()
3495 {
3496 return true;
3497 }
3498
3499 override bool IsTakeable()
3500 {
3501 return false;
3502 }
3503
3504 //this into/outo parent.Cargo
3505 override bool CanPutInCargo( EntityAI parent )
3506 {
3507 return false;
3508 }
3509
3510 override bool CanRemoveFromCargo( EntityAI parent )
3511 {
3512 return false;
3513 }
3514
3515 //hands
3516 override bool CanPutIntoHands( EntityAI parent )
3517 {
3518 return false;
3519 }
3520
3521 //--- ACTION CONDITIONS
3522 //direction
3523 override bool IsFacingPlayer( PlayerBase player, string selection )
3524 {
3525 return true;
3526 }
3527
3528 override bool IsPlayerInside( PlayerBase player, string selection )
3529 {
3530 return true;
3531 }
3532
3535 {
3536 return false;
3537 }
3538
3539 //camera direction check
3540 bool IsFacingCamera( string selection )
3541 {
3542 return true;
3543 }
3544
3545 //roof check
3546 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
3547 {
3548 return false;
3549 }
3550
3551 //selection->player distance check
3552 bool HasProperDistance( string selection, PlayerBase player )
3553 {
3554 return true;
3555 }
3556
3557 //folding
3559 {
3560 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
3561 {
3562 return false;
3563 }
3564
3565 return true;
3566 }
3567
3569 {
3572
3573 return item;
3574 }
3575
3576 //Damage triggers (barbed wire)
3577 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
3578 {
3579 if ( GetGame() && GetGame().IsServer() )
3580 {
3581 //destroy area damage if some already exists
3582 DestroyAreaDamage( slot_name );
3583
3584 //create new area damage
3586 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
3587
3588 vector min_max[2];
3589 if ( MemoryPointExists( slot_name + "_min" ) )
3590 {
3591 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3592 }
3593 if ( MemoryPointExists( slot_name + "_max" ) )
3594 {
3595 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3596 }
3597
3598 //get proper trigger extents (min<max)
3599 vector extents[2];
3600 GetConstruction().GetTriggerExtents( min_max, extents );
3601
3602 //get box center
3603 vector center;
3604 center = GetConstruction().GetBoxCenter( min_max );
3605 center = ModelToWorld( center );
3606
3607 //rotate center if needed
3608 vector orientation = GetOrientation();;
3609 CalcDamageAreaRotation( rotation_angle, center, orientation );
3610
3611 areaDamage.SetExtents( extents[0], extents[1] );
3612 areaDamage.SetAreaPosition( center );
3613 areaDamage.SetAreaOrientation( orientation );
3614 areaDamage.SetLoopInterval( 1.0 );
3615 areaDamage.SetDeferDuration( 0.2 );
3616 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3617 areaDamage.SetAmmoName( "BarbedWireHit" );
3618 areaDamage.Spawn();
3619
3620 m_DamageTriggers.Insert( slot_name, areaDamage );
3621 }
3622 }
3623
3624 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
3625 {
3626 if ( angle_deg != 0 )
3627 {
3628 //orientation
3629 orientation[0] = orientation[0] - angle_deg;
3630
3631 //center
3632 vector rotate_axis;
3633 if ( MemoryPointExists( "rotate_axis" ) )
3634 {
3635 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3636 }
3637 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];
3638 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];
3639 center[0] = r_center_x;
3640 center[2] = r_center_z;
3641 }
3642 }
3643
3644 void DestroyAreaDamage( string slot_name )
3645 {
3646 if (GetGame() && GetGame().IsServer())
3647 {
3649 if (m_DamageTriggers.Find(slot_name, areaDamage))
3650 {
3651 if (areaDamage)
3652 {
3653 areaDamage.Destroy();
3654 }
3655
3656 m_DamageTriggers.Remove( slot_name );
3657 }
3658 }
3659 }
3660
3661 override bool IsIgnoredByConstruction()
3662 {
3663 return true;
3664 }
3665
3666 //================================================================
3667 // SOUNDS
3668 //================================================================
3669 protected void SoundBuildStart( string part_name )
3670 {
3671 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
3672 }
3673
3674 protected void SoundDismantleStart( string part_name )
3675 {
3676 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3677 }
3678
3679 protected void SoundDestroyStart( string part_name )
3680 {
3681 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3682 }
3683
3684 protected string GetBuildSoundByMaterial( string part_name )
3685 {
3686 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3687
3688 switch ( material_type )
3689 {
3690 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
3691 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
3692 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
3693 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
3694 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
3695 }
3696
3697 return "";
3698 }
3699
3700 protected string GetDismantleSoundByMaterial( string part_name )
3701 {
3702 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3703
3704 switch ( material_type )
3705 {
3706 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
3707 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
3708 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
3709 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
3710 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
3711 }
3712
3713 return "";
3714 }
3715
3716 //misc
3717 void CheckForHybridAttachments( EntityAI item, string slot_name )
3718 {
3719 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
3720 {
3721 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
3722 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
3723 {
3724 SetHealth(slot_name,"Health",item.GetHealth());
3725 }
3726 }
3727 }
3728
3729 override int GetDamageSystemVersionChange()
3730 {
3731 return 111;
3732 }
3733
3734 override void SetActions()
3735 {
3736 super.SetActions();
3737
3741 }
3742
3743 //================================================================
3744 // DEBUG
3745 //================================================================
3746 protected void DebugCustomState()
3747 {
3748 }
3749
3752 {
3753 return null;
3754 }
3755
3756 override void OnDebugSpawn()
3757 {
3758 FullyBuild();
3759 }
3760
3761 void FullyBuild()
3762 {
3764 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
3765
3766 Man p;
3767
3768 #ifdef SERVER
3769 array<Man> players = new array<Man>;
3770 GetGame().GetWorld().GetPlayerList(players);
3771 if (players.Count())
3772 p = players[0];
3773 #else
3774 p = GetGame().GetPlayer();
3775 #endif
3776
3777 foreach (ConstructionPart part : parts)
3778 {
3779 bool excluded = false;
3780 string partName = part.GetPartName();
3781 if (excludes)
3782 {
3783 foreach (string exclude : excludes)
3784 {
3785 if (partName.Contains(exclude))
3786 {
3787 excluded = true;
3788 break;
3789 }
3790 }
3791 }
3792
3793 if (!excluded)
3794 {
3795 OnPartBuiltServer(p, partName, AT_BUILD_PART);
3796 }
3797 }
3798
3799 GetConstruction().UpdateVisuals();
3800 }
3801}
3802
3803void bsbDebugPrint (string s)
3804{
3805#ifdef BSB_DEBUG
3806 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3807#else
3808 //Print("" + s); // comment/uncomment to hide/see debug logs
3809#endif
3810}
3811void bsbDebugSpam (string s)
3812{
3813#ifdef BSB_DEBUG_SPAM
3814 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3815#else
3816 //Print("" + s); // comment/uncomment to hide/see debug logs
3817#endif
3818}
const int AT_DISMANTLE_PART
const int AT_DESTROY_PART
const int AT_BUILD_PART
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:1969
const string ANIMATION_DEPLOYED
Определения BaseBuildingBase.c:1313
override int GetHideIconMask()
Определения BaseBuildingBase.c:1398
override void OnStoreSave(ParamsWriteContext ctx)
Определения BaseBuildingBase.c:1729
void FullyBuild()
Определения BaseBuildingBase.c:2579
void UpdateVisuals()
Определения BaseBuildingBase.c:2095
void SetActionFromSyncData()
Определения BaseBuildingBase.c:1568
int m_SyncParts01
Определения BaseBuildingBase.c:1321
void UpdateNavmesh()
Определения BaseBuildingBase.c:2214
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2263
override void OnDebugSpawn()
Определения BaseBuildingBase.c:2574
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения BaseBuildingBase.c:2569
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:2497
const string SOUND_BUILD_WOOD_LOG
Определения BaseBuildingBase.c:1329
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:2487
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2114
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:2442
override bool CanObstruct()
Определения BaseBuildingBase.c:1393
bool HasAttachmentsBesidesBase()
Определения BaseBuildingBase.c:2296
override void InitItemSounds()
Определения BaseBuildingBase.c:1403
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1457
const string SOUND_DISMANTLE_METAL
Определения BaseBuildingBase.c:1338
void InitBaseState()
Определения BaseBuildingBase.c:2070
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:2291
void BaseBuildingBase()
Определения BaseBuildingBase.c:1348
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:1785
void DestroyConstruction()
Определения BaseBuildingBase.c:1722
ref array< string > m_HybridAttachments
Определения BaseBuildingBase.c:1344
int m_InteractedPartId
Определения BaseBuildingBase.c:1324
override string GetFoldSoundset()
Определения BaseBuildingBase.c:1417
bool m_HasBase
Определения BaseBuildingBase.c:1319
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2518
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:2230
void UpdatePhysics()
Определения BaseBuildingBase.c:2148
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2341
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1929
bool HasProperDistance(string selection, PlayerBase player)
Определения BaseBuildingBase.c:2370
override void OnCreatePhysics()
Определения BaseBuildingBase.c:1798
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1896
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:1555
const string SOUND_BUILD_WOOD_PLANK
Определения BaseBuildingBase.c:1330
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:1627
ref array< string > m_Mountables
Определения BaseBuildingBase.c:1345
const string SOUND_BUILD_WIRE
Определения BaseBuildingBase.c:1333
int m_SyncParts03
Определения BaseBuildingBase.c:1323
void ResetActionSyncData()
Определения BaseBuildingBase.c:1561
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:1388
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1936
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:2535
override void EEOnAfterLoad()
Определения BaseBuildingBase.c:1839
override void EEItemDetached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1871
vector GetKitSpawnPosition()
Определения BaseBuildingBase.c:1705
ref Construction m_Construction
Определения BaseBuildingBase.c:1317
bool IsFacingCamera(string selection)
Определения BaseBuildingBase.c:2358
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
Определения BaseBuildingBase.c:2258
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:2249
override bool IsDeployable()
Определения BaseBuildingBase.c:1674
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:2009
override void EEInit()
Определения BaseBuildingBase.c:1849
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1486
void bsbDebugSpam(string s)
Определения BaseBuildingBase.c:1320
override void OnVariablesSynchronized()
Определения BaseBuildingBase.c:1436
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения BaseBuildingBase.c:2364
Construction GetConstruction()
Определения BaseBuildingBase.c:2284
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:2492
void DebugCustomState()
Определения BaseBuildingBase.c:2564
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:1643
string GetConstructionKitType()
Определения BaseBuildingBase.c:1710
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2268
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения BaseBuildingBase.c:1976
bool CanFoldBaseBuildingObject()
Определения BaseBuildingBase.c:2376
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:2547
const string SOUND_DISMANTLE_WOOD_PLANK
Определения BaseBuildingBase.c:1336
override void EEItemAttached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1862
const string SOUND_DISMANTLE_WOOD_LOG
Определения BaseBuildingBase.c:1335
void InitVisuals()
Определения BaseBuildingBase.c:2079
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
Определения BaseBuildingBase.c:1312
const string SOUND_BUILD_WOOD_STAIRS
Определения BaseBuildingBase.c:1331
ItemBase FoldBaseBuildingObject()
Определения BaseBuildingBase.c:2386
override bool CanPutInCargo(EntityAI parent)
Определения BaseBuildingBase.c:2323
override bool CanUseConstruction()
Определения BaseBuildingBase.c:2220
override void AfterStoreLoad()
Определения BaseBuildingBase.c:1775
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:1585
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:1805
override bool IgnoreOutOfReachCondition()
Определения BaseBuildingBase.c:1889
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BaseBuildingBase.c:1741
override bool ShowZonesHealth()
Определения BaseBuildingBase.c:2312
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2184
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2346
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2502
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:1685
const string SOUND_DISMANTLE_WIRE
Определения BaseBuildingBase.c:1339
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
Определения BaseBuildingBase.c:2352
override bool IsTakeable()
Определения BaseBuildingBase.c:2317
float m_ConstructionKitHealth
Определения BaseBuildingBase.c:1315
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:1377
override void SetActions()
Определения BaseBuildingBase.c:2552
void HandleItemFalling(ConstructionPart part)
Disconnected temporarily.
Определения BaseBuildingBase.c:2016
void DestroyConstructionKit(ItemBase construction_kit)
Определения BaseBuildingBase.c:1715
void CreateConstructionKitInHands(notnull PlayerBase player)
Определения BaseBuildingBase.c:1696
bool IsOpened()
Определения BaseBuildingBase.c:1679
void ItemFall(vector min, vector max)
Disconnected temporarily.
Определения BaseBuildingBase.c:2055
int m_PerformedActionId
Определения BaseBuildingBase.c:1325
override bool CanUseConstructionBuild()
Определения BaseBuildingBase.c:2225
bool HasBase()
Определения BaseBuildingBase.c:1664
void OnSynchronizedClient()
Определения BaseBuildingBase.c:1444
void SynchronizeBaseState()
Определения BaseBuildingBase.c:1428
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:2479
ref map< string, ref AreaDamageManager > m_DamageTriggers
Определения BaseBuildingBase.c:1343
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:1669
const string SOUND_BUILD_METAL
Определения BaseBuildingBase.c:1332
override string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:1422
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
Определения BaseBuildingBase.c:1879
override bool CanPutIntoHands(EntityAI parent)
Определения BaseBuildingBase.c:2334
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:1515
override bool CanRemoveFromCargo(EntityAI parent)
Определения BaseBuildingBase.c:2328
void ConstructionInit()
Определения BaseBuildingBase.c:2274
int m_SyncParts02
Определения BaseBuildingBase.c:1322
const string SOUND_DISMANTLE_WOOD_STAIRS
Определения BaseBuildingBase.c:1337
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:2345
void CreateAreaDamage()
Определения FireplaceBase.c:2329
Empty
Определения Hand_States.c:14
EffectSound m_Sound
Определения HungerSoundHandler.c:18
string GetFoldSoundset()
Определения BaseBuildingBase.c:1417
string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:1422
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9229
bool m_FixDamageSystemInit
Определения ItemBase.c:4907
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
Определения 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.
Определения 3_Game/tools/Debug.c:122
Определения 3_Game/tools/Debug.c:2
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
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:911
static bool IsBaseBuildingLogEnable()
Определения 3_Game/tools/Debug.c:698
Определения 3_Game/tools/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)
bool m_Loop
Определения ItemSoundHandler.c:5
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
Определения 3_Game/constants.c:848
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
Определения 3_Game/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/tools/tools.c:8

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