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

◆ FullyBuild()

void bsbDebugPrint::FullyBuild ( )
protected

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

2581{
2582 const string ANIMATION_DEPLOYED = "Deployed";
2583
2584 float m_ConstructionKitHealth; //stored health value for used construction kit
2585
2587
2588 bool m_HasBase;
2589 //variables for synchronization of base building parts (2x31 is the current limit)
2590 int m_SyncParts01; //synchronization for already built parts (31 parts)
2591 int m_SyncParts02; //synchronization for already built parts (+31 parts)
2592 int m_SyncParts03; //synchronization for already built parts (+31 parts)
2593 int m_InteractedPartId; //construction part id that an action was performed on
2594 int m_PerformedActionId; //action id that was performed on a construction part
2595
2596 //Sounds
2597 //build
2598 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
2599 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
2600 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
2601 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
2602 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
2603 //dismantle
2604 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
2605 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
2606 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
2607 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
2608 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
2609
2610 protected EffectSound m_Sound;
2611
2615
2616 // Constructor
2617 void BaseBuildingBase()
2618 {
2620
2621 //synchronized variables
2622 RegisterNetSyncVariableInt( "m_SyncParts01" );
2623 RegisterNetSyncVariableInt( "m_SyncParts02" );
2624 RegisterNetSyncVariableInt( "m_SyncParts03" );
2625 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2626 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2627 RegisterNetSyncVariableBool( "m_HasBase" );
2628
2629 //Construction init
2631
2632 if (ConfigIsExisting("hybridAttachments"))
2633 {
2635 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
2636 }
2637 if (ConfigIsExisting("mountables"))
2638 {
2640 ConfigGetTextArray("mountables", m_Mountables);
2641 }
2642
2643 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
2644 }
2645
2646 override void EEDelete(EntityAI parent)
2647 {
2648 super.EEDelete(parent);
2649
2650 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
2651 {
2652 areaDamage.Destroy();
2653 }
2654
2655 }
2656
2657 override string GetInvulnerabilityTypeString()
2658 {
2659 return "disableBaseDamage";
2660 }
2661
2662 override bool CanObstruct()
2663 {
2664 return true;
2665 }
2666
2667 override int GetHideIconMask()
2668 {
2669 return EInventoryIconVisibility.HIDE_VICINITY;
2670 }
2671
2672 override void InitItemSounds()
2673 {
2674 super.InitItemSounds();
2675
2677 SoundParameters params = new SoundParameters();
2678 params.m_Loop = true;
2679
2680 if (GetFoldSoundset() != string.Empty)
2681 handler.AddSound(SoundConstants.ITEM_FOLD, GetFoldSoundset());
2682 if (GetLoopFoldSoundset() != string.Empty)
2683 handler.AddSound(SoundConstants.ITEM_FOLD_LOOP, GetLoopFoldSoundset(), params);
2684 }
2685
2686 override string GetFoldSoundset()
2687 {
2688 return "putDown_FenceKit_SoundSet";
2689 }
2690
2691 override string GetLoopFoldSoundset()
2692 {
2693 return "Shelter_Site_Build_Loop_SoundSet";
2694 }
2695
2696 // --- SYNCHRONIZATION
2698 {
2699 if ( GetGame().IsServer() )
2700 {
2701 SetSynchDirty();
2702 }
2703 }
2704
2705 override void OnVariablesSynchronized()
2706 {
2707 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
2708 super.OnVariablesSynchronized();
2709
2711 }
2712
2713 protected void OnSynchronizedClient()
2714 {
2715 //update parts
2717
2718 //update action on part
2720
2721 //update visuals (client)
2722 UpdateVisuals();
2723 }
2724
2725 //parts synchronization
2726 void RegisterPartForSync( int part_id )
2727 {
2728 //part_id must starts from index = 1
2729 int offset;
2730 int mask;
2731
2732 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2733 {
2734 offset = part_id - 1;
2735 mask = 1 << offset;
2736
2737 m_SyncParts01 = m_SyncParts01 | mask;
2738 }
2739 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2740 {
2741 offset = ( part_id % 32 );
2742 mask = 1 << offset;
2743
2744 m_SyncParts02 = m_SyncParts02 | mask;
2745 }
2746 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2747 {
2748 offset = ( part_id % 63 );
2749 mask = 1 << offset;
2750
2751 m_SyncParts03 = m_SyncParts03 | mask;
2752 }
2753 }
2754
2755 void UnregisterPartForSync( int part_id )
2756 {
2757 //part_id must starts from index = 1
2758 int offset;
2759 int mask;
2760
2761 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2762 {
2763 offset = part_id - 1;
2764 mask = 1 << offset;
2765
2766 m_SyncParts01 = m_SyncParts01 & ~mask;
2767 }
2768 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2769 {
2770 offset = ( part_id % 32 );
2771 mask = 1 << offset;
2772
2773 m_SyncParts02 = m_SyncParts02 & ~mask;
2774 }
2775 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2776 {
2777 offset = ( part_id % 63 );
2778 mask = 1 << offset;
2779
2780 m_SyncParts03 = m_SyncParts03 & ~mask;
2781 }
2782 }
2783
2784 bool IsPartBuildInSyncData( int part_id )
2785 {
2786 //part_id must starts from index = 1
2787 int offset;
2788 int mask;
2789
2790 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2791 {
2792 offset = part_id - 1;
2793 mask = 1 << offset;
2794
2795 if ( ( m_SyncParts01 & mask ) > 0 )
2796 {
2797 return true;
2798 }
2799 }
2800 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2801 {
2802 offset = ( part_id % 32 );
2803 mask = 1 << offset;
2804
2805 if ( ( m_SyncParts02 & mask ) > 0 )
2806 {
2807 return true;
2808 }
2809 }
2810 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2811 {
2812 offset = ( part_id % 63 );
2813 mask = 1 << offset;
2814
2815 if ( ( m_SyncParts03 & mask ) > 0 )
2816 {
2817 return true;
2818 }
2819 }
2820
2821 return false;
2822 }
2823
2824 protected void RegisterActionForSync( int part_id, int action_id )
2825 {
2826 m_InteractedPartId = part_id;
2827 m_PerformedActionId = action_id;
2828 }
2829
2830 protected void ResetActionSyncData()
2831 {
2832 //reset data
2833 m_InteractedPartId = -1;
2835 }
2836
2837 protected void SetActionFromSyncData()
2838 {
2839 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
2840 {
2842 int build_action_id = m_PerformedActionId;
2843
2844 switch( build_action_id )
2845 {
2846 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
2847 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
2848 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
2849 }
2850 }
2851 }
2852 //------
2853
2855 {
2856 string key = part.m_PartName;
2857 bool is_base = part.IsBase();
2858 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
2859 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
2860 if ( is_part_built_sync )
2861 {
2862 if ( !part.IsBuilt() )
2863 {
2864 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
2865 GetConstruction().AddToConstructedParts( key );
2866 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
2867
2868 if (is_base)
2869 {
2871 RemoveProxyPhysics( ANIMATION_DEPLOYED );
2872 }
2873 }
2874 }
2875 else
2876 {
2877 if ( part.IsBuilt() )
2878 {
2879 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
2880 GetConstruction().RemoveFromConstructedParts( key );
2881 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
2882
2883 if (is_base)
2884 {
2886 AddProxyPhysics( ANIMATION_DEPLOYED );
2887 }
2888 }
2889 }
2890
2891 //check slot lock for material attachments
2892 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
2893 }
2894
2895 //set construction parts based on synchronized data
2897 {
2898 Construction construction = GetConstruction();
2899 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2900
2901 for ( int i = 0; i < construction_parts.Count(); ++i )
2902 {
2903 string key = construction_parts.GetKey( i );
2904 ConstructionPart value = construction_parts.Get( key );
2905 SetPartFromSyncData(value);
2906 }
2907
2908 //regenerate navmesh
2909 UpdateNavmesh();
2910 }
2911
2912 protected ConstructionPart GetConstructionPartById( int id )
2913 {
2914 Construction construction = GetConstruction();
2915 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2916
2917 for ( int i = 0; i < construction_parts.Count(); ++i )
2918 {
2919 string key = construction_parts.GetKey( i );
2920 ConstructionPart value = construction_parts.Get( key );
2921
2922 if ( value.GetId() == id )
2923 {
2924 return value;
2925 }
2926 }
2927
2928 return NULL;
2929 }
2930 //
2931
2932 //Base
2933 bool HasBase()
2934 {
2935 return m_HasBase;
2936 }
2937
2938 void SetBaseState( bool has_base )
2939 {
2940 m_HasBase = has_base;
2941 }
2942
2943 override bool IsDeployable()
2944 {
2945 return true;
2946 }
2947
2948 bool IsOpened()
2949 {
2950 return false;
2951 }
2952
2953 //--- CONSTRUCTION KIT
2955 {
2956 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
2957 if ( m_ConstructionKitHealth > 0 )
2958 {
2959 construction_kit.SetHealth( m_ConstructionKitHealth );
2960 }
2961
2962 return construction_kit;
2963 }
2964
2965 void CreateConstructionKitInHands(notnull PlayerBase player)
2966 {
2967 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2968 if ( m_ConstructionKitHealth > 0 )
2969 {
2970 construction_kit.SetHealth( m_ConstructionKitHealth );
2971 }
2972 }
2973
2974 protected vector GetKitSpawnPosition()
2975 {
2976 return GetPosition();
2977 }
2978
2979 protected string GetConstructionKitType()
2980 {
2981 return "";
2982 }
2983
2984 void DestroyConstructionKit( ItemBase construction_kit )
2985 {
2986 m_ConstructionKitHealth = construction_kit.GetHealth();
2987 GetGame().ObjectDelete( construction_kit );
2988 }
2989
2990 //--- CONSTRUCTION
2991 void DestroyConstruction()
2992 {
2993 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2994 GetGame().ObjectDelete( this );
2995 }
2996
2997 // --- EVENTS
2998 override void OnStoreSave( ParamsWriteContext ctx )
2999 {
3000 super.OnStoreSave( ctx );
3001
3002 //sync parts 01
3003 ctx.Write( m_SyncParts01 );
3004 ctx.Write( m_SyncParts02 );
3005 ctx.Write( m_SyncParts03 );
3006
3007 ctx.Write( m_HasBase );
3008 }
3009
3010 override bool OnStoreLoad( ParamsReadContext ctx, int version )
3011 {
3012 if ( !super.OnStoreLoad( ctx, version ) )
3013 return false;
3014
3015 //--- Base building data ---
3016 //Restore synced parts data
3017 if ( !ctx.Read( m_SyncParts01 ) )
3018 {
3019 m_SyncParts01 = 0; //set default
3020 return false;
3021 }
3022 if ( !ctx.Read( m_SyncParts02 ) )
3023 {
3024 m_SyncParts02 = 0; //set default
3025 return false;
3026 }
3027 if ( !ctx.Read( m_SyncParts03 ) )
3028 {
3029 m_SyncParts03 = 0; //set default
3030 return false;
3031 }
3032
3033 //has base
3034 if ( !ctx.Read( m_HasBase ) )
3035 {
3036 m_HasBase = false;
3037 return false;
3038 }
3039 //---
3040
3041 return true;
3042 }
3043
3044 override void AfterStoreLoad()
3045 {
3046 super.AfterStoreLoad();
3047
3049 {
3051 }
3052 }
3053
3055 {
3056 //update server data
3058
3059 //set base state
3060 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
3061 SetBaseState( construction_part.IsBuilt() ) ;
3062
3063 //synchronize after load
3065 }
3066
3067 override void OnCreatePhysics()
3068 {
3069 super.OnCreatePhysics();
3072 }
3073
3074 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
3075 {
3077 return;
3078
3079 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
3080
3081 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
3082 return;
3083
3084 Construction construction = GetConstruction();
3085 string part_name = zone;
3086 part_name.ToLower();
3087
3088 if ( newLevel == GameConstants.STATE_RUINED )
3089 {
3090 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
3091
3092 if ( construction_part && construction.IsPartConstructed( part_name ) )
3093 {
3094 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
3095 construction.DestroyConnectedParts(part_name);
3096 }
3097
3098 //barbed wire handling (hack-ish)
3099 if ( part_name.Contains("barbed") )
3100 {
3101 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
3102 if (barbed_wire)
3103 barbed_wire.SetMountedState( false );
3104 }
3105 }
3106 }
3107
3108 override void EEOnAfterLoad()
3109 {
3111 {
3113 }
3114
3115 super.EEOnAfterLoad();
3116 }
3117
3118 override void EEInit()
3119 {
3120 super.EEInit();
3121
3122 // init visuals and physics
3123 InitBaseState();
3124
3125 //debug
3126 #ifdef DEVELOPER
3128 #endif
3129 }
3130
3131 override void EEItemAttached( EntityAI item, string slot_name )
3132 {
3133 super.EEItemAttached( item, slot_name );
3134
3135 CheckForHybridAttachments( item, slot_name );
3136 UpdateVisuals();
3137 UpdateAttachmentPhysics( slot_name, false );
3138 }
3139
3140 override void EEItemDetached( EntityAI item, string slot_name )
3141 {
3142 super.EEItemDetached( item, slot_name );
3143
3144 UpdateVisuals();
3145 UpdateAttachmentPhysics( slot_name, false );
3146 }
3147
3148 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
3149 {
3150 string slot_name = InventorySlots.GetSlotName( slotId );
3151 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
3152
3153 UpdateAttachmentVisuals( slot_name, locked );
3154 UpdateAttachmentPhysics( slot_name, locked );
3155 }
3156
3157 //ignore out of reach condition
3158 override bool IgnoreOutOfReachCondition()
3159 {
3160 return true;
3161 }
3162
3163 //CONSTRUCTION EVENTS
3164 //Build
3165 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
3166 {
3167 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
3168
3169 //check base state
3170 if (construtionPart.IsBase())
3171 {
3172 SetBaseState(true);
3173
3174 //spawn kit
3176 }
3177
3178 //register constructed parts for synchronization
3179 RegisterPartForSync(construtionPart.GetId());
3180
3181 //register action that was performed on part
3182 RegisterActionForSync(construtionPart.GetId(), action_id);
3183
3184 //synchronize
3186
3187 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
3188
3189 UpdateNavmesh();
3190
3191 //update visuals
3192 UpdateVisuals();
3193
3194 //reset action sync data
3196 }
3197
3198 void OnPartBuiltClient(string part_name, int action_id)
3199 {
3200 //play sound
3201 SoundBuildStart( part_name );
3202 }
3203
3204 //Dismantle
3205 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
3206 {
3207 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
3208 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
3209
3210 //register constructed parts for synchronization
3211 UnregisterPartForSync(construtionPart.GetId());
3212
3213 //register action that was performed on part
3214 RegisterActionForSync(construtionPart.GetId(), action_id);
3215
3216 //synchronize
3218
3219 // server part of sync, client will be synced from SetPartsFromSyncData
3220 SetPartFromSyncData(construtionPart);
3221
3222 UpdateNavmesh();
3223
3224 //update visuals
3225 UpdateVisuals();
3226
3227 //reset action sync data
3229
3230 //check base state
3231 if (construtionPart.IsBase())
3232 {
3233 //Destroy construction
3235 }
3236 }
3237
3238 void OnPartDismantledClient( string part_name, int action_id )
3239 {
3240 //play sound
3241 SoundDismantleStart( part_name );
3242 }
3243
3244 //Destroy
3245 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
3246 {
3247 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
3248 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
3249
3250 //register constructed parts for synchronization
3251 UnregisterPartForSync(construtionPart.GetId());
3252
3253 //register action that was performed on part
3254 RegisterActionForSync(construtionPart.GetId(), action_id);
3255
3256 //synchronize
3258
3259 // server part of sync, client will be synced from SetPartsFromSyncData
3260 SetPartFromSyncData(construtionPart);
3261
3262 UpdateNavmesh();
3263
3264 //update visuals
3265 UpdateVisuals();
3266
3267 //reset action sync data
3269
3270 //check base state
3271 if (construtionPart.IsBase())
3272 {
3273 //Destroy construction
3275 }
3276 }
3277
3278 void OnPartDestroyedClient( string part_name, int action_id )
3279 {
3280 //play sound
3281 SoundDestroyStart( part_name );
3282 }
3283
3285 protected void HandleItemFalling(ConstructionPart part)
3286 {
3287 bool process = false;
3288
3289 //TODO: add a parameter to parts' config classes?
3290 process |= part.m_PartName.Contains("_roof");
3291 process |= part.m_PartName.Contains("_platform");
3292 process |= part.m_PartName.Contains("_stair");
3293
3294 if (process)
3295 {
3296 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
3297 {
3298 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
3299 return;
3300 }
3301
3302 vector mins, maxs;
3303 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
3304 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
3305
3306 //sanitize minmaxs
3307 vector minTmp, maxTmp;
3308 minTmp[0] = Math.Min(mins[0],maxs[0]);
3309 maxTmp[0] = Math.Max(mins[0],maxs[0]);
3310 minTmp[1] = Math.Min(mins[1],maxs[1]);
3311 maxTmp[1] = Math.Max(mins[1],maxs[1]);
3312 minTmp[2] = Math.Min(mins[2],maxs[2]);
3313 maxTmp[2] = Math.Max(mins[2],maxs[2]);
3314 mins = minTmp;
3315 maxs = maxTmp;
3316
3317 maxs[1] = maxs[1] + 0.35; //reach a little above..
3318
3319 ItemFall(mins,maxs);
3320 }
3321 }
3322
3324 protected void ItemFall(vector min, vector max)
3325 {
3326 array<EntityAI> foundEntities = new array<EntityAI>();
3327 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
3328
3329 //filtering
3330 ItemBase item;
3331 foreach (EntityAI entity : foundEntities)
3332 {
3333 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
3334 item.ThrowPhysically(null,vector.Zero);
3335 }
3336 }
3337
3338 // --- UPDATE
3339 void InitBaseState()
3340 {
3341 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
3342
3343 InitVisuals();
3344 UpdateNavmesh(); //regenerate navmesh
3345 GetConstruction().InitBaseState();
3346 }
3347
3348 void InitVisuals()
3349 {
3350 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
3351 //check base
3352 if ( !HasBase() )
3353 {
3354 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
3355 }
3356 else
3357 {
3358 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
3359 }
3360
3361 GetConstruction().UpdateVisuals();
3362 }
3363
3364 void UpdateVisuals()
3365 {
3366 array<string> attachmentSlots = new array<string>;
3367
3368 GetAttachmentSlots(this, attachmentSlots);
3369 foreach (string slotName : attachmentSlots)
3370 {
3372 }
3373
3374 //check base
3375 if (!HasBase())
3376 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
3377 else
3378 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
3379
3380 GetConstruction().UpdateVisuals();
3381 }
3382
3383 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
3384 {
3385 string slotNameMounted = slot_name + "_Mounted";
3386 EntityAI attachment = FindAttachmentBySlotName(slot_name);
3387
3388 if (attachment)
3389 {
3390 BarbedWire barbedWire = BarbedWire.Cast(attachment);
3391 if (barbedWire && barbedWire.IsMounted())
3392 CreateAreaDamage(slotNameMounted);
3393 else
3394 DestroyAreaDamage(slotNameMounted);
3395
3396 if (is_locked)
3397 {
3398 SetAnimationPhase(slotNameMounted, 0);
3399 SetAnimationPhase(slot_name, 1);
3400 }
3401 else
3402 {
3403 SetAnimationPhase(slotNameMounted, 1);
3404 SetAnimationPhase(slot_name, 0);
3405 }
3406 }
3407 else
3408 {
3409 SetAnimationPhase(slotNameMounted, 1);
3410 SetAnimationPhase(slot_name, 1);
3411
3412 DestroyAreaDamage(slotNameMounted);
3413 }
3414 }
3415
3416 // avoid calling this function on frequent occasions, it's a massive performance hit
3417 void UpdatePhysics()
3418 {
3420 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
3421
3422 array<string> attachmentSlots = new array<string>;
3423 GetAttachmentSlots(this, attachmentSlots);
3424
3426 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
3427
3428 foreach (string slotName : attachmentSlots)
3429 {
3431 }
3432
3433 //check base
3434 if (!HasBase())
3435 {
3437 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
3438
3439 AddProxyPhysics(ANIMATION_DEPLOYED);
3440 }
3441 else
3442 {
3444 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
3445
3446 RemoveProxyPhysics(ANIMATION_DEPLOYED);
3447 }
3448
3449 GetConstruction().UpdatePhysics();
3450 UpdateNavmesh();
3451 }
3452
3453 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
3454 {
3455 //checks for invalid appends; hotfix
3456 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
3457 return;
3458 //----------------------------------
3459 string slot_name_mounted = slot_name + "_Mounted";
3460 EntityAI attachment = FindAttachmentBySlotName( slot_name );
3461
3462 //remove proxy physics
3463 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
3464 RemoveProxyPhysics( slot_name_mounted );
3465 RemoveProxyPhysics( slot_name );
3466
3467 if ( attachment )
3468 {
3469 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
3470 if ( is_locked )
3471 {
3472 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
3473 AddProxyPhysics( slot_name_mounted );
3474 }
3475 else
3476 {
3477 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
3478 AddProxyPhysics( slot_name );
3479 }
3480 }
3481 }
3482
3483 protected void UpdateNavmesh()
3484 {
3485 SetAffectPathgraph( true, false );
3486 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
3487 }
3488
3489 override bool CanUseConstruction()
3490 {
3491 return true;
3492 }
3493
3494 override bool CanUseConstructionBuild()
3495 {
3496 return true;
3497 }
3498
3499 protected bool IsAttachmentSlotLocked( EntityAI attachment )
3500 {
3501 if ( attachment )
3502 {
3503 InventoryLocation inventory_location = new InventoryLocation;
3504 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3505
3506 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
3507 }
3508
3509 return false;
3510 }
3511
3512 protected bool IsAttachmentSlotLocked( string slot_name )
3513 {
3514 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
3515 }
3516
3517 //--- ATTACHMENT SLOTS
3518 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
3519 {
3520 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3521 if ( GetGame().ConfigIsExisting( config_path ) )
3522 {
3523 GetGame().ConfigGetTextArray( config_path, attachment_slots );
3524 }
3525 }
3526
3527 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
3528 {
3529 return true;
3530 }
3531
3532 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
3533 {
3534 return true;
3535 }
3536
3537 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
3538 {
3539 return true;
3540 }
3541
3542 // --- INIT
3543 void ConstructionInit()
3544 {
3545 if ( !m_Construction )
3546 {
3547 m_Construction = new Construction( this );
3548 }
3549
3550 GetConstruction().Init();
3551 }
3552
3554 {
3555 return m_Construction;
3556 }
3557
3558 //--- INVENTORY/ATTACHMENTS CONDITIONS
3559 //attachments
3560 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
3561 {
3562 return super.CanReceiveAttachment(attachment, slotId);
3563 }
3564
3566 {
3567 int attachment_count = GetInventory().AttachmentCount();
3568 if ( attachment_count > 0 )
3569 {
3570 if ( HasBase() && attachment_count == 1 )
3571 {
3572 return false;
3573 }
3574
3575 return true;
3576 }
3577
3578 return false;
3579 }
3580
3581 override bool ShowZonesHealth()
3582 {
3583 return true;
3584 }
3585
3586 override bool IsTakeable()
3587 {
3588 return false;
3589 }
3590
3591 //this into/outo parent.Cargo
3592 override bool CanPutInCargo( EntityAI parent )
3593 {
3594 return false;
3595 }
3596
3597 override bool CanRemoveFromCargo( EntityAI parent )
3598 {
3599 return false;
3600 }
3601
3602 //hands
3603 override bool CanPutIntoHands( EntityAI parent )
3604 {
3605 return false;
3606 }
3607
3608 //--- ACTION CONDITIONS
3609 //direction
3610 override bool IsFacingPlayer( PlayerBase player, string selection )
3611 {
3612 return true;
3613 }
3614
3615 override bool IsPlayerInside( PlayerBase player, string selection )
3616 {
3617 return true;
3618 }
3619
3622 {
3623 return false;
3624 }
3625
3626 //camera direction check
3627 bool IsFacingCamera( string selection )
3628 {
3629 return true;
3630 }
3631
3632 //roof check
3633 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
3634 {
3635 return false;
3636 }
3637
3638 //selection->player distance check
3639 bool HasProperDistance( string selection, PlayerBase player )
3640 {
3641 return true;
3642 }
3643
3644 //folding
3646 {
3647 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
3648 {
3649 return false;
3650 }
3651
3652 return true;
3653 }
3654
3656 {
3659
3660 return item;
3661 }
3662
3663 //Damage triggers (barbed wire)
3664 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
3665 {
3666 if ( GetGame() && GetGame().IsServer() )
3667 {
3668 //destroy area damage if some already exists
3669 DestroyAreaDamage( slot_name );
3670
3671 //create new area damage
3673 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
3674
3675 vector min_max[2];
3676 if ( MemoryPointExists( slot_name + "_min" ) )
3677 {
3678 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3679 }
3680 if ( MemoryPointExists( slot_name + "_max" ) )
3681 {
3682 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3683 }
3684
3685 //get proper trigger extents (min<max)
3686 vector extents[2];
3687 GetConstruction().GetTriggerExtents( min_max, extents );
3688
3689 //get box center
3690 vector center;
3691 center = GetConstruction().GetBoxCenter( min_max );
3692 center = ModelToWorld( center );
3693
3694 //rotate center if needed
3695 vector orientation = GetOrientation();;
3696 CalcDamageAreaRotation( rotation_angle, center, orientation );
3697
3698 areaDamage.SetExtents( extents[0], extents[1] );
3699 areaDamage.SetAreaPosition( center );
3700 areaDamage.SetAreaOrientation( orientation );
3701 areaDamage.SetLoopInterval( 1.0 );
3702 areaDamage.SetDeferDuration( 0.2 );
3703 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3704 areaDamage.SetAmmoName( "BarbedWireHit" );
3705 areaDamage.Spawn();
3706
3707 m_DamageTriggers.Insert( slot_name, areaDamage );
3708 }
3709 }
3710
3711 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
3712 {
3713 if ( angle_deg != 0 )
3714 {
3715 //orientation
3716 orientation[0] = orientation[0] - angle_deg;
3717
3718 //center
3719 vector rotate_axis;
3720 if ( MemoryPointExists( "rotate_axis" ) )
3721 {
3722 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3723 }
3724 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];
3725 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];
3726 center[0] = r_center_x;
3727 center[2] = r_center_z;
3728 }
3729 }
3730
3731 void DestroyAreaDamage( string slot_name )
3732 {
3733 if (GetGame() && GetGame().IsServer())
3734 {
3736 if (m_DamageTriggers.Find(slot_name, areaDamage))
3737 {
3738 if (areaDamage)
3739 {
3740 areaDamage.Destroy();
3741 }
3742
3743 m_DamageTriggers.Remove( slot_name );
3744 }
3745 }
3746 }
3747
3748 override bool IsIgnoredByConstruction()
3749 {
3750 return true;
3751 }
3752
3753 //================================================================
3754 // SOUNDS
3755 //================================================================
3756 protected void SoundBuildStart( string part_name )
3757 {
3758 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
3759 }
3760
3761 protected void SoundDismantleStart( string part_name )
3762 {
3763 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3764 }
3765
3766 protected void SoundDestroyStart( string part_name )
3767 {
3768 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3769 }
3770
3771 protected string GetBuildSoundByMaterial( string part_name )
3772 {
3773 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3774
3775 switch ( material_type )
3776 {
3777 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
3778 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
3779 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
3780 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
3781 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
3782 }
3783
3784 return "";
3785 }
3786
3787 protected string GetDismantleSoundByMaterial( string part_name )
3788 {
3789 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3790
3791 switch ( material_type )
3792 {
3793 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
3794 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
3795 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
3796 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
3797 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
3798 }
3799
3800 return "";
3801 }
3802
3803 //misc
3804 void CheckForHybridAttachments( EntityAI item, string slot_name )
3805 {
3806 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
3807 {
3808 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
3809 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
3810 {
3811 SetHealth(slot_name,"Health",item.GetHealth());
3812 }
3813 }
3814 }
3815
3816 override int GetDamageSystemVersionChange()
3817 {
3818 return 111;
3819 }
3820
3821 override void SetActions()
3822 {
3823 super.SetActions();
3824
3828 }
3829
3830 //================================================================
3831 // DEBUG
3832 //================================================================
3833 protected void DebugCustomState()
3834 {
3835 }
3836
3839 {
3840 return null;
3841 }
3842
3843 override void OnDebugSpawn()
3844 {
3845 FullyBuild();
3846 }
3847
3848 void FullyBuild()
3849 {
3851 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
3852
3853 Man p;
3854
3855 #ifdef SERVER
3856 array<Man> players = new array<Man>;
3857 GetGame().GetWorld().GetPlayerList(players);
3858 if (players.Count())
3859 p = players[0];
3860 #else
3861 p = GetGame().GetPlayer();
3862 #endif
3863
3864 foreach (ConstructionPart part : parts)
3865 {
3866 bool excluded = false;
3867 string partName = part.GetPartName();
3868 if (excludes)
3869 {
3870 foreach (string exclude : excludes)
3871 {
3872 if (partName.Contains(exclude))
3873 {
3874 excluded = true;
3875 break;
3876 }
3877 }
3878 }
3879
3880 if (!excluded)
3881 {
3882 OnPartBuiltServer(p, partName, AT_BUILD_PART);
3883 }
3884 }
3885
3886 GetConstruction().UpdateVisuals();
3887 }
3888}
3889
3890void bsbDebugPrint (string s)
3891{
3892#ifdef BSB_DEBUG
3893 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3894#else
3895 //Print("" + s); // comment/uncomment to hide/see debug logs
3896#endif
3897}
3898void bsbDebugSpam (string s)
3899{
3900#ifdef BSB_DEBUG_SPAM
3901 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3902#else
3903 //Print("" + s); // comment/uncomment to hide/see debug logs
3904#endif
3905}
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::OnDebugSpawn().