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

◆ SetActions()

override void bsbDebugPrint::SetActions ( )
protected

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

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