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

◆ CanUseConstruction()

override bool bsbDebugPrint::CanUseConstruction ( )
protected

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

2182{
2183 const string ANIMATION_DEPLOYED = "Deployed";
2184
2185 float m_ConstructionKitHealth; //stored health value for used construction kit
2186
2188
2189 bool m_HasBase;
2190 //variables for synchronization of base building parts (2x31 is the current limit)
2191 int m_SyncParts01; //synchronization for already built parts (31 parts)
2192 int m_SyncParts02; //synchronization for already built parts (+31 parts)
2193 int m_SyncParts03; //synchronization for already built parts (+31 parts)
2194 int m_InteractedPartId; //construction part id that an action was performed on
2195 int m_PerformedActionId; //action id that was performed on a construction part
2196
2197 //Sounds
2198 //build
2199 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
2200 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
2201 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
2202 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
2203 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
2204 //dismantle
2205 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
2206 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
2207 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
2208 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
2209 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
2210
2211 protected EffectSound m_Sound;
2212
2216
2217 // Constructor
2218 void BaseBuildingBase()
2219 {
2221
2222 //synchronized variables
2223 RegisterNetSyncVariableInt( "m_SyncParts01" );
2224 RegisterNetSyncVariableInt( "m_SyncParts02" );
2225 RegisterNetSyncVariableInt( "m_SyncParts03" );
2226 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2227 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2228 RegisterNetSyncVariableBool( "m_HasBase" );
2229
2230 //Construction init
2232
2233 if (ConfigIsExisting("hybridAttachments"))
2234 {
2236 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
2237 }
2238 if (ConfigIsExisting("mountables"))
2239 {
2241 ConfigGetTextArray("mountables", m_Mountables);
2242 }
2243
2244 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
2245 }
2246
2247 override void EEDelete(EntityAI parent)
2248 {
2249 super.EEDelete(parent);
2250
2251 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
2252 {
2253 areaDamage.Destroy();
2254 }
2255
2256 }
2257
2258 override string GetInvulnerabilityTypeString()
2259 {
2260 return "disableBaseDamage";
2261 }
2262
2263 override bool CanObstruct()
2264 {
2265 return true;
2266 }
2267
2268 override int GetHideIconMask()
2269 {
2270 return EInventoryIconVisibility.HIDE_VICINITY;
2271 }
2272
2273 // --- SYNCHRONIZATION
2275 {
2276 if ( GetGame().IsServer() )
2277 {
2278 SetSynchDirty();
2279 }
2280 }
2281
2282 override void OnVariablesSynchronized()
2283 {
2284 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
2285 super.OnVariablesSynchronized();
2286
2288 }
2289
2290 protected void OnSynchronizedClient()
2291 {
2292 //update parts
2294
2295 //update action on part
2297
2298 //update visuals (client)
2299 UpdateVisuals();
2300 }
2301
2302 //parts synchronization
2303 void RegisterPartForSync( int part_id )
2304 {
2305 //part_id must starts from index = 1
2306 int offset;
2307 int mask;
2308
2309 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2310 {
2311 offset = part_id - 1;
2312 mask = 1 << offset;
2313
2314 m_SyncParts01 = m_SyncParts01 | mask;
2315 }
2316 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2317 {
2318 offset = ( part_id % 32 );
2319 mask = 1 << offset;
2320
2321 m_SyncParts02 = m_SyncParts02 | mask;
2322 }
2323 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2324 {
2325 offset = ( part_id % 63 );
2326 mask = 1 << offset;
2327
2328 m_SyncParts03 = m_SyncParts03 | mask;
2329 }
2330 }
2331
2332 void UnregisterPartForSync( int part_id )
2333 {
2334 //part_id must starts from index = 1
2335 int offset;
2336 int mask;
2337
2338 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2339 {
2340 offset = part_id - 1;
2341 mask = 1 << offset;
2342
2343 m_SyncParts01 = m_SyncParts01 & ~mask;
2344 }
2345 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2346 {
2347 offset = ( part_id % 32 );
2348 mask = 1 << offset;
2349
2350 m_SyncParts02 = m_SyncParts02 & ~mask;
2351 }
2352 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2353 {
2354 offset = ( part_id % 63 );
2355 mask = 1 << offset;
2356
2357 m_SyncParts03 = m_SyncParts03 & ~mask;
2358 }
2359 }
2360
2361 bool IsPartBuildInSyncData( int part_id )
2362 {
2363 //part_id must starts from index = 1
2364 int offset;
2365 int mask;
2366
2367 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2368 {
2369 offset = part_id - 1;
2370 mask = 1 << offset;
2371
2372 if ( ( m_SyncParts01 & mask ) > 0 )
2373 {
2374 return true;
2375 }
2376 }
2377 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2378 {
2379 offset = ( part_id % 32 );
2380 mask = 1 << offset;
2381
2382 if ( ( m_SyncParts02 & mask ) > 0 )
2383 {
2384 return true;
2385 }
2386 }
2387 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2388 {
2389 offset = ( part_id % 63 );
2390 mask = 1 << offset;
2391
2392 if ( ( m_SyncParts03 & mask ) > 0 )
2393 {
2394 return true;
2395 }
2396 }
2397
2398 return false;
2399 }
2400
2401 protected void RegisterActionForSync( int part_id, int action_id )
2402 {
2403 m_InteractedPartId = part_id;
2404 m_PerformedActionId = action_id;
2405 }
2406
2407 protected void ResetActionSyncData()
2408 {
2409 //reset data
2410 m_InteractedPartId = -1;
2412 }
2413
2414 protected void SetActionFromSyncData()
2415 {
2416 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
2417 {
2419 int build_action_id = m_PerformedActionId;
2420
2421 switch( build_action_id )
2422 {
2423 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
2424 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
2425 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
2426 }
2427 }
2428 }
2429 //------
2430
2432 {
2433 string key = part.m_PartName;
2434 bool is_base = part.IsBase();
2435 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
2436 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
2437 if ( is_part_built_sync )
2438 {
2439 if ( !part.IsBuilt() )
2440 {
2441 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
2442 GetConstruction().AddToConstructedParts( key );
2443 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
2444
2445 if (is_base)
2446 {
2448 RemoveProxyPhysics( ANIMATION_DEPLOYED );
2449 }
2450 }
2451 }
2452 else
2453 {
2454 if ( part.IsBuilt() )
2455 {
2456 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
2457 GetConstruction().RemoveFromConstructedParts( key );
2458 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
2459
2460 if (is_base)
2461 {
2463 AddProxyPhysics( ANIMATION_DEPLOYED );
2464 }
2465 }
2466 }
2467
2468 //check slot lock for material attachments
2469 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
2470 }
2471
2472 //set construction parts based on synchronized data
2474 {
2475 Construction construction = GetConstruction();
2476 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2477
2478 for ( int i = 0; i < construction_parts.Count(); ++i )
2479 {
2480 string key = construction_parts.GetKey( i );
2481 ConstructionPart value = construction_parts.Get( key );
2482 SetPartFromSyncData(value);
2483 }
2484
2485 //regenerate navmesh
2486 UpdateNavmesh();
2487 }
2488
2489 protected ConstructionPart GetConstructionPartById( int id )
2490 {
2491 Construction construction = GetConstruction();
2492 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2493
2494 for ( int i = 0; i < construction_parts.Count(); ++i )
2495 {
2496 string key = construction_parts.GetKey( i );
2497 ConstructionPart value = construction_parts.Get( key );
2498
2499 if ( value.GetId() == id )
2500 {
2501 return value;
2502 }
2503 }
2504
2505 return NULL;
2506 }
2507 //
2508
2509 //Base
2510 bool HasBase()
2511 {
2512 return m_HasBase;
2513 }
2514
2515 void SetBaseState( bool has_base )
2516 {
2517 m_HasBase = has_base;
2518 }
2519
2520 override bool IsDeployable()
2521 {
2522 return true;
2523 }
2524
2525 bool IsOpened()
2526 {
2527 return false;
2528 }
2529
2530 //--- CONSTRUCTION KIT
2532 {
2533 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
2534 if ( m_ConstructionKitHealth > 0 )
2535 {
2536 construction_kit.SetHealth( m_ConstructionKitHealth );
2537 }
2538
2539 return construction_kit;
2540 }
2541
2542 void CreateConstructionKitInHands(notnull PlayerBase player)
2543 {
2544 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2545 if ( m_ConstructionKitHealth > 0 )
2546 {
2547 construction_kit.SetHealth( m_ConstructionKitHealth );
2548 }
2549 }
2550
2551 protected vector GetKitSpawnPosition()
2552 {
2553 return GetPosition();
2554 }
2555
2556 protected string GetConstructionKitType()
2557 {
2558 return "";
2559 }
2560
2561 void DestroyConstructionKit( ItemBase construction_kit )
2562 {
2563 m_ConstructionKitHealth = construction_kit.GetHealth();
2564 GetGame().ObjectDelete( construction_kit );
2565 }
2566
2567 //--- CONSTRUCTION
2568 void DestroyConstruction()
2569 {
2570 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2571 GetGame().ObjectDelete( this );
2572 }
2573
2574 // --- EVENTS
2575 override void OnStoreSave( ParamsWriteContext ctx )
2576 {
2577 super.OnStoreSave( ctx );
2578
2579 //sync parts 01
2580 ctx.Write( m_SyncParts01 );
2581 ctx.Write( m_SyncParts02 );
2582 ctx.Write( m_SyncParts03 );
2583
2584 ctx.Write( m_HasBase );
2585 }
2586
2587 override bool OnStoreLoad( ParamsReadContext ctx, int version )
2588 {
2589 if ( !super.OnStoreLoad( ctx, version ) )
2590 return false;
2591
2592 //--- Base building data ---
2593 //Restore synced parts data
2594 if ( !ctx.Read( m_SyncParts01 ) )
2595 {
2596 m_SyncParts01 = 0; //set default
2597 return false;
2598 }
2599 if ( !ctx.Read( m_SyncParts02 ) )
2600 {
2601 m_SyncParts02 = 0; //set default
2602 return false;
2603 }
2604 if ( !ctx.Read( m_SyncParts03 ) )
2605 {
2606 m_SyncParts03 = 0; //set default
2607 return false;
2608 }
2609
2610 //has base
2611 if ( !ctx.Read( m_HasBase ) )
2612 {
2613 m_HasBase = false;
2614 return false;
2615 }
2616 //---
2617
2618 return true;
2619 }
2620
2621 override void AfterStoreLoad()
2622 {
2623 super.AfterStoreLoad();
2624
2626 {
2628 }
2629 }
2630
2632 {
2633 //update server data
2635
2636 //set base state
2637 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
2638 SetBaseState( construction_part.IsBuilt() ) ;
2639
2640 //synchronize after load
2642 }
2643
2644 override void OnCreatePhysics()
2645 {
2646 super.OnCreatePhysics();
2649 }
2650
2651 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2652 {
2654 return;
2655
2656 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2657
2658 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
2659 return;
2660
2661 Construction construction = GetConstruction();
2662 string part_name = zone;
2663 part_name.ToLower();
2664
2665 if ( newLevel == GameConstants.STATE_RUINED )
2666 {
2667 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2668
2669 if ( construction_part && construction.IsPartConstructed( part_name ) )
2670 {
2671 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
2672 construction.DestroyConnectedParts(part_name);
2673 }
2674
2675 //barbed wire handling (hack-ish)
2676 if ( part_name.Contains("barbed") )
2677 {
2678 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2679 if (barbed_wire)
2680 barbed_wire.SetMountedState( false );
2681 }
2682 }
2683 }
2684
2685 override void EEOnAfterLoad()
2686 {
2688 {
2690 }
2691
2692 super.EEOnAfterLoad();
2693 }
2694
2695 override void EEInit()
2696 {
2697 super.EEInit();
2698
2699 // init visuals and physics
2700 InitBaseState();
2701
2702 //debug
2703 #ifdef DEVELOPER
2705 #endif
2706 }
2707
2708 override void EEItemAttached( EntityAI item, string slot_name )
2709 {
2710 super.EEItemAttached( item, slot_name );
2711
2712 CheckForHybridAttachments( item, slot_name );
2713 UpdateVisuals();
2714 UpdateAttachmentPhysics( slot_name, false );
2715 }
2716
2717 override void EEItemDetached( EntityAI item, string slot_name )
2718 {
2719 super.EEItemDetached( item, slot_name );
2720
2721 UpdateVisuals();
2722 UpdateAttachmentPhysics( slot_name, false );
2723 }
2724
2725 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
2726 {
2727 string slot_name = InventorySlots.GetSlotName( slotId );
2728 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
2729
2730 UpdateAttachmentVisuals( slot_name, locked );
2731 UpdateAttachmentPhysics( slot_name, locked );
2732 }
2733
2734 //ignore out of reach condition
2735 override bool IgnoreOutOfReachCondition()
2736 {
2737 return true;
2738 }
2739
2740 //CONSTRUCTION EVENTS
2741 //Build
2742 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
2743 {
2744 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2745
2746 //check base state
2747 if (construtionPart.IsBase())
2748 {
2749 SetBaseState(true);
2750
2751 //spawn kit
2753 }
2754
2755 //register constructed parts for synchronization
2756 RegisterPartForSync(construtionPart.GetId());
2757
2758 //register action that was performed on part
2759 RegisterActionForSync(construtionPart.GetId(), action_id);
2760
2761 //synchronize
2763
2764 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
2765
2766 UpdateNavmesh();
2767
2768 //update visuals
2769 UpdateVisuals();
2770
2771 //reset action sync data
2773 }
2774
2775 void OnPartBuiltClient(string part_name, int action_id)
2776 {
2777 //play sound
2778 SoundBuildStart( part_name );
2779 }
2780
2781 //Dismantle
2782 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
2783 {
2784 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
2785 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2786
2787 //register constructed parts for synchronization
2788 UnregisterPartForSync(construtionPart.GetId());
2789
2790 //register action that was performed on part
2791 RegisterActionForSync(construtionPart.GetId(), action_id);
2792
2793 //synchronize
2795
2796 // server part of sync, client will be synced from SetPartsFromSyncData
2797 SetPartFromSyncData(construtionPart);
2798
2799 UpdateNavmesh();
2800
2801 //update visuals
2802 UpdateVisuals();
2803
2804 //reset action sync data
2806
2807 //check base state
2808 if (construtionPart.IsBase())
2809 {
2810 //Destroy construction
2812 }
2813
2814 if (GetGame().IsServer())
2815 HandleItemFalling(construtionPart);
2816 }
2817
2818 void OnPartDismantledClient( string part_name, int action_id )
2819 {
2820 //play sound
2821 SoundDismantleStart( part_name );
2822 }
2823
2824 //Destroy
2825 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
2826 {
2827 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
2828 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2829
2830 //register constructed parts for synchronization
2831 UnregisterPartForSync(construtionPart.GetId());
2832
2833 //register action that was performed on part
2834 RegisterActionForSync(construtionPart.GetId(), action_id);
2835
2836 //synchronize
2838
2839 // server part of sync, client will be synced from SetPartsFromSyncData
2840 SetPartFromSyncData(construtionPart);
2841
2842 UpdateNavmesh();
2843
2844 //update visuals
2845 UpdateVisuals();
2846
2847 //reset action sync data
2849
2850 //check base state
2851 if (construtionPart.IsBase())
2852 {
2853 //Destroy construction
2855 }
2856
2857 if (GetGame().IsServer())
2858 HandleItemFalling(construtionPart);
2859 }
2860
2861 void OnPartDestroyedClient( string part_name, int action_id )
2862 {
2863 //play sound
2864 SoundDestroyStart( part_name );
2865 }
2866
2867 protected void HandleItemFalling(ConstructionPart part)
2868 {
2869 bool process = false;
2870
2871 //TODO: add a parameter to parts' config classes?
2872 process |= part.m_PartName.Contains("_roof");
2873 process |= part.m_PartName.Contains("_platform");
2874 process |= part.m_PartName.Contains("_stair");
2875
2876 if (process)
2877 {
2878 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
2879 {
2880 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
2881 return;
2882 }
2883
2884 vector mins, maxs;
2885 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
2886 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
2887
2888 //sanitize minmaxs
2889 vector minTmp, maxTmp;
2890 minTmp[0] = Math.Min(mins[0],maxs[0]);
2891 maxTmp[0] = Math.Max(mins[0],maxs[0]);
2892 minTmp[1] = Math.Min(mins[1],maxs[1]);
2893 maxTmp[1] = Math.Max(mins[1],maxs[1]);
2894 minTmp[2] = Math.Min(mins[2],maxs[2]);
2895 maxTmp[2] = Math.Max(mins[2],maxs[2]);
2896 mins = minTmp;
2897 maxs = maxTmp;
2898
2899 maxs[1] = maxs[1] + 0.35; //reach a little above..
2900
2901 ItemFall(mins,maxs);
2902 }
2903 }
2904
2905 protected void ItemFall(vector min, vector max)
2906 {
2907 array<EntityAI> foundEntities = new array<EntityAI>();
2908 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
2909
2910 //filtering
2911 ItemBase item;
2912 foreach (EntityAI entity : foundEntities)
2913 {
2914 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
2915 item.ThrowPhysically(null,vector.Zero);
2916 }
2917 }
2918
2919 // --- UPDATE
2920 void InitBaseState()
2921 {
2922 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
2923
2924 InitVisuals();
2925 UpdateNavmesh(); //regenerate navmesh
2926 GetConstruction().InitBaseState();
2927 }
2928
2929 void InitVisuals()
2930 {
2931 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
2932 //check base
2933 if ( !HasBase() )
2934 {
2935 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
2936 }
2937 else
2938 {
2939 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
2940 }
2941
2942 GetConstruction().UpdateVisuals();
2943 }
2944
2945 void UpdateVisuals()
2946 {
2947 array<string> attachmentSlots = new array<string>;
2948
2949 GetAttachmentSlots(this, attachmentSlots);
2950 foreach (string slotName : attachmentSlots)
2951 {
2953 }
2954
2955 //check base
2956 if (!HasBase())
2957 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
2958 else
2959 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
2960
2961 GetConstruction().UpdateVisuals();
2962 }
2963
2964 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
2965 {
2966 string slotNameMounted = slot_name + "_Mounted";
2967 EntityAI attachment = FindAttachmentBySlotName(slot_name);
2968
2969 if (attachment)
2970 {
2971 BarbedWire barbedWire = BarbedWire.Cast(attachment);
2972 if (barbedWire && barbedWire.IsMounted())
2973 CreateAreaDamage(slotNameMounted);
2974 else
2975 DestroyAreaDamage(slotNameMounted);
2976
2977 if (is_locked)
2978 {
2979 SetAnimationPhase(slotNameMounted, 0);
2980 SetAnimationPhase(slot_name, 1);
2981 }
2982 else
2983 {
2984 SetAnimationPhase(slotNameMounted, 1);
2985 SetAnimationPhase(slot_name, 0);
2986 }
2987 }
2988 else
2989 {
2990 SetAnimationPhase(slotNameMounted, 1);
2991 SetAnimationPhase(slot_name, 1);
2992
2993 DestroyAreaDamage(slotNameMounted);
2994 }
2995 }
2996
2997 // avoid calling this function on frequent occasions, it's a massive performance hit
2998 void UpdatePhysics()
2999 {
3001 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
3002
3003 array<string> attachmentSlots = new array<string>;
3004 GetAttachmentSlots(this, attachmentSlots);
3005
3007 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
3008
3009 foreach (string slotName : attachmentSlots)
3010 {
3012 }
3013
3014 //check base
3015 if (!HasBase())
3016 {
3018 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
3019
3020 AddProxyPhysics(ANIMATION_DEPLOYED);
3021 }
3022 else
3023 {
3025 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
3026
3027 RemoveProxyPhysics(ANIMATION_DEPLOYED);
3028 }
3029
3030 GetConstruction().UpdatePhysics();
3031 UpdateNavmesh();
3032 }
3033
3034 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
3035 {
3036 //checks for invalid appends; hotfix
3037 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
3038 return;
3039 //----------------------------------
3040 string slot_name_mounted = slot_name + "_Mounted";
3041 EntityAI attachment = FindAttachmentBySlotName( slot_name );
3042
3043 //remove proxy physics
3044 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
3045 RemoveProxyPhysics( slot_name_mounted );
3046 RemoveProxyPhysics( slot_name );
3047
3048 if ( attachment )
3049 {
3050 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
3051 if ( is_locked )
3052 {
3053 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
3054 AddProxyPhysics( slot_name_mounted );
3055 }
3056 else
3057 {
3058 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
3059 AddProxyPhysics( slot_name );
3060 }
3061 }
3062 }
3063
3064 protected void UpdateNavmesh()
3065 {
3066 SetAffectPathgraph( true, false );
3067 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
3068 }
3069
3070 override bool CanUseConstruction()
3071 {
3072 return true;
3073 }
3074
3075 override bool CanUseConstructionBuild()
3076 {
3077 return true;
3078 }
3079
3080 protected bool IsAttachmentSlotLocked( EntityAI attachment )
3081 {
3082 if ( attachment )
3083 {
3084 InventoryLocation inventory_location = new InventoryLocation;
3085 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3086
3087 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
3088 }
3089
3090 return false;
3091 }
3092
3093 protected bool IsAttachmentSlotLocked( string slot_name )
3094 {
3095 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
3096 }
3097
3098 //--- ATTACHMENT SLOTS
3099 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
3100 {
3101 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3102 if ( GetGame().ConfigIsExisting( config_path ) )
3103 {
3104 GetGame().ConfigGetTextArray( config_path, attachment_slots );
3105 }
3106 }
3107
3108 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
3109 {
3110 return true;
3111 }
3112
3113 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
3114 {
3115 return true;
3116 }
3117
3118 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
3119 {
3120 return true;
3121 }
3122
3123 // --- INIT
3124 void ConstructionInit()
3125 {
3126 if ( !m_Construction )
3127 {
3128 m_Construction = new Construction( this );
3129 }
3130
3131 GetConstruction().Init();
3132 }
3133
3135 {
3136 return m_Construction;
3137 }
3138
3139 //--- INVENTORY/ATTACHMENTS CONDITIONS
3140 //attachments
3141 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
3142 {
3143 return super.CanReceiveAttachment(attachment, slotId);
3144 }
3145
3147 {
3148 int attachment_count = GetInventory().AttachmentCount();
3149 if ( attachment_count > 0 )
3150 {
3151 if ( HasBase() && attachment_count == 1 )
3152 {
3153 return false;
3154 }
3155
3156 return true;
3157 }
3158
3159 return false;
3160 }
3161
3162 override bool ShowZonesHealth()
3163 {
3164 return true;
3165 }
3166
3167 override bool IsTakeable()
3168 {
3169 return false;
3170 }
3171
3172 //this into/outo parent.Cargo
3173 override bool CanPutInCargo( EntityAI parent )
3174 {
3175 return false;
3176 }
3177
3178 override bool CanRemoveFromCargo( EntityAI parent )
3179 {
3180 return false;
3181 }
3182
3183 //hands
3184 override bool CanPutIntoHands( EntityAI parent )
3185 {
3186 return false;
3187 }
3188
3189 //--- ACTION CONDITIONS
3190 //direction
3191 override bool IsFacingPlayer( PlayerBase player, string selection )
3192 {
3193 return true;
3194 }
3195
3196 override bool IsPlayerInside( PlayerBase player, string selection )
3197 {
3198 return true;
3199 }
3200
3203 {
3204 return false;
3205 }
3206
3207 //camera direction check
3208 bool IsFacingCamera( string selection )
3209 {
3210 return true;
3211 }
3212
3213 //roof check
3214 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
3215 {
3216 return false;
3217 }
3218
3219 //selection->player distance check
3220 bool HasProperDistance( string selection, PlayerBase player )
3221 {
3222 return true;
3223 }
3224
3225 //folding
3227 {
3228 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
3229 {
3230 return false;
3231 }
3232
3233 return true;
3234 }
3235
3237 {
3240
3241 return item;
3242 }
3243
3244 //Damage triggers (barbed wire)
3245 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
3246 {
3247 if ( GetGame() && GetGame().IsServer() )
3248 {
3249 //destroy area damage if some already exists
3250 DestroyAreaDamage( slot_name );
3251
3252 //create new area damage
3254 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
3255
3256 vector min_max[2];
3257 if ( MemoryPointExists( slot_name + "_min" ) )
3258 {
3259 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3260 }
3261 if ( MemoryPointExists( slot_name + "_max" ) )
3262 {
3263 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3264 }
3265
3266 //get proper trigger extents (min<max)
3267 vector extents[2];
3268 GetConstruction().GetTriggerExtents( min_max, extents );
3269
3270 //get box center
3271 vector center;
3272 center = GetConstruction().GetBoxCenter( min_max );
3273 center = ModelToWorld( center );
3274
3275 //rotate center if needed
3276 vector orientation = GetOrientation();;
3277 CalcDamageAreaRotation( rotation_angle, center, orientation );
3278
3279 areaDamage.SetExtents( extents[0], extents[1] );
3280 areaDamage.SetAreaPosition( center );
3281 areaDamage.SetAreaOrientation( orientation );
3282 areaDamage.SetLoopInterval( 1.0 );
3283 areaDamage.SetDeferDuration( 0.2 );
3284 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3285 areaDamage.SetAmmoName( "BarbedWireHit" );
3286 areaDamage.Spawn();
3287
3288 m_DamageTriggers.Insert( slot_name, areaDamage );
3289 }
3290 }
3291
3292 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
3293 {
3294 if ( angle_deg != 0 )
3295 {
3296 //orientation
3297 orientation[0] = orientation[0] - angle_deg;
3298
3299 //center
3300 vector rotate_axis;
3301 if ( MemoryPointExists( "rotate_axis" ) )
3302 {
3303 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3304 }
3305 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];
3306 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];
3307 center[0] = r_center_x;
3308 center[2] = r_center_z;
3309 }
3310 }
3311
3312 void DestroyAreaDamage( string slot_name )
3313 {
3314 if (GetGame() && GetGame().IsServer())
3315 {
3317 if (m_DamageTriggers.Find(slot_name, areaDamage))
3318 {
3319 if (areaDamage)
3320 {
3321 areaDamage.Destroy();
3322 }
3323
3324 m_DamageTriggers.Remove( slot_name );
3325 }
3326 }
3327 }
3328
3329 override bool IsIgnoredByConstruction()
3330 {
3331 return true;
3332 }
3333
3334 //================================================================
3335 // SOUNDS
3336 //================================================================
3337 protected void SoundBuildStart( string part_name )
3338 {
3339 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
3340 }
3341
3342 protected void SoundDismantleStart( string part_name )
3343 {
3344 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3345 }
3346
3347 protected void SoundDestroyStart( string part_name )
3348 {
3349 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3350 }
3351
3352 protected string GetBuildSoundByMaterial( string part_name )
3353 {
3354 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3355
3356 switch ( material_type )
3357 {
3358 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
3359 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
3360 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
3361 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
3362 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
3363 }
3364
3365 return "";
3366 }
3367
3368 protected string GetDismantleSoundByMaterial( string part_name )
3369 {
3370 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3371
3372 switch ( material_type )
3373 {
3374 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
3375 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
3376 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
3377 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
3378 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
3379 }
3380
3381 return "";
3382 }
3383
3384 //misc
3385 void CheckForHybridAttachments( EntityAI item, string slot_name )
3386 {
3387 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
3388 {
3389 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
3390 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
3391 {
3392 SetHealth(slot_name,"Health",item.GetHealth());
3393 }
3394 }
3395 }
3396
3397 override int GetDamageSystemVersionChange()
3398 {
3399 return 111;
3400 }
3401
3402 override void SetActions()
3403 {
3404 super.SetActions();
3405
3409 }
3410
3411 //================================================================
3412 // DEBUG
3413 //================================================================
3414 protected void DebugCustomState()
3415 {
3416 }
3417
3420 {
3421 return null;
3422 }
3423
3424 override void OnDebugSpawn()
3425 {
3426 FullyBuild();
3427 }
3428
3429 void FullyBuild()
3430 {
3432 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
3433
3434 Man p;
3435
3436 #ifdef SERVER
3437 array<Man> players = new array<Man>;
3438 GetGame().GetWorld().GetPlayerList(players);
3439 if (players.Count())
3440 p = players[0];
3441 #else
3442 p = GetGame().GetPlayer();
3443 #endif
3444
3445 foreach (ConstructionPart part : parts)
3446 {
3447 bool excluded = false;
3448 string partName = part.GetPartName();
3449 if (excludes)
3450 {
3451 foreach (string exclude : excludes)
3452 {
3453 if (partName.Contains(exclude))
3454 {
3455 excluded = true;
3456 break;
3457 }
3458 }
3459 }
3460
3461 if (!excluded)
3462 {
3463 OnPartBuiltServer(p, partName, AT_BUILD_PART);
3464 }
3465 }
3466
3467 GetConstruction().UpdateVisuals();
3468 }
3469}
3470
3471void bsbDebugPrint (string s)
3472{
3473#ifdef BSB_DEBUG
3474 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3475#else
3476 //Print("" + s); // comment/uncomment to hide/see debug logs
3477#endif
3478}
3479void bsbDebugSpam (string s)
3480{
3481#ifdef BSB_DEBUG_SPAM
3482 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3483#else
3484 //Print("" + s); // comment/uncomment to hide/see debug logs
3485#endif
3486}
const int AT_DISMANTLE_PART
Определения _constants.c:7
const int AT_DESTROY_PART
Определения _constants.c:8
const int AT_BUILD_PART
Определения _constants.c:6
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
vector GetOrientation()
Определения AreaDamageManager.c:306
void AreaDamageManager(EntityAI parent)
Определения AreaDamageManager.c:22
void OnPartDismantledClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1928
const string ANIMATION_DEPLOYED
Определения BaseBuildingBase.c:1293
override int GetHideIconMask()
Определения BaseBuildingBase.c:1378
override void OnStoreSave(ParamsWriteContext ctx)
Определения BaseBuildingBase.c:1685
void FullyBuild()
Определения BaseBuildingBase.c:2539
void UpdateVisuals()
Определения BaseBuildingBase.c:2055
void SetActionFromSyncData()
Определения BaseBuildingBase.c:1524
int m_SyncParts01
Определения BaseBuildingBase.c:1301
void UpdateNavmesh()
Определения BaseBuildingBase.c:2174
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2223
override void OnDebugSpawn()
Определения BaseBuildingBase.c:2534
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения BaseBuildingBase.c:2529
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:2457
const string SOUND_BUILD_WOOD_LOG
Определения BaseBuildingBase.c:1309
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:2447
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2074
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:2402
override bool CanObstruct()
Определения BaseBuildingBase.c:1373
bool HasAttachmentsBesidesBase()
Определения BaseBuildingBase.c:2256
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1413
const string SOUND_DISMANTLE_METAL
Определения BaseBuildingBase.c:1318
void InitBaseState()
Определения BaseBuildingBase.c:2030
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:2251
void BaseBuildingBase()
Определения BaseBuildingBase.c:1328
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:1741
void DestroyConstruction()
Определения BaseBuildingBase.c:1678
ref array< string > m_HybridAttachments
Определения BaseBuildingBase.c:1324
int m_InteractedPartId
Определения BaseBuildingBase.c:1304
bool m_HasBase
Определения BaseBuildingBase.c:1299
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2478
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:2190
void UpdatePhysics()
Определения BaseBuildingBase.c:2108
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2301
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1885
bool HasProperDistance(string selection, PlayerBase player)
Определения BaseBuildingBase.c:2330
override void OnCreatePhysics()
Определения BaseBuildingBase.c:1754
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1852
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:1511
const string SOUND_BUILD_WOOD_PLANK
Определения BaseBuildingBase.c:1310
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:1583
ref array< string > m_Mountables
Определения BaseBuildingBase.c:1325
const string SOUND_BUILD_WIRE
Определения BaseBuildingBase.c:1313
int m_SyncParts03
Определения BaseBuildingBase.c:1303
void ResetActionSyncData()
Определения BaseBuildingBase.c:1517
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:1368
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1892
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:2495
override void EEOnAfterLoad()
Определения BaseBuildingBase.c:1795
override void EEItemDetached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1827
vector GetKitSpawnPosition()
Определения BaseBuildingBase.c:1661
ref Construction m_Construction
Определения BaseBuildingBase.c:1297
bool IsFacingCamera(string selection)
Определения BaseBuildingBase.c:2318
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
Определения BaseBuildingBase.c:2218
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:2209
override bool IsDeployable()
Определения BaseBuildingBase.c:1630
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1971
override void EEInit()
Определения BaseBuildingBase.c:1805
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1442
void bsbDebugSpam(string s)
Определения BaseBuildingBase.c:1300
override void OnVariablesSynchronized()
Определения BaseBuildingBase.c:1392
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения BaseBuildingBase.c:2324
Construction GetConstruction()
Определения BaseBuildingBase.c:2244
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:2452
void DebugCustomState()
Определения BaseBuildingBase.c:2524
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:1599
string GetConstructionKitType()
Определения BaseBuildingBase.c:1666
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2228
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения BaseBuildingBase.c:1935
bool CanFoldBaseBuildingObject()
Определения BaseBuildingBase.c:2336
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:2507
const string SOUND_DISMANTLE_WOOD_PLANK
Определения BaseBuildingBase.c:1316
override void EEItemAttached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1818
const string SOUND_DISMANTLE_WOOD_LOG
Определения BaseBuildingBase.c:1315
void InitVisuals()
Определения BaseBuildingBase.c:2039
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
Определения BaseBuildingBase.c:1292
const string SOUND_BUILD_WOOD_STAIRS
Определения BaseBuildingBase.c:1311
ItemBase FoldBaseBuildingObject()
Определения BaseBuildingBase.c:2346
override bool CanPutInCargo(EntityAI parent)
Определения BaseBuildingBase.c:2283
override bool CanUseConstruction()
Определения BaseBuildingBase.c:2180
override void AfterStoreLoad()
Определения BaseBuildingBase.c:1731
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:1541
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:1761
override bool IgnoreOutOfReachCondition()
Определения BaseBuildingBase.c:1845
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BaseBuildingBase.c:1697
override bool ShowZonesHealth()
Определения BaseBuildingBase.c:2272
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2144
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2306
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2462
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:1641
const string SOUND_DISMANTLE_WIRE
Определения BaseBuildingBase.c:1319
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
Определения BaseBuildingBase.c:2312
override bool IsTakeable()
Определения BaseBuildingBase.c:2277
float m_ConstructionKitHealth
Определения BaseBuildingBase.c:1295
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:1357
override void SetActions()
Определения BaseBuildingBase.c:2512
void HandleItemFalling(ConstructionPart part)
Определения BaseBuildingBase.c:1977
void DestroyConstructionKit(ItemBase construction_kit)
Определения BaseBuildingBase.c:1671
void CreateConstructionKitInHands(notnull PlayerBase player)
Определения BaseBuildingBase.c:1652
bool IsOpened()
Определения BaseBuildingBase.c:1635
void ItemFall(vector min, vector max)
Определения BaseBuildingBase.c:2015
int m_PerformedActionId
Определения BaseBuildingBase.c:1305
override bool CanUseConstructionBuild()
Определения BaseBuildingBase.c:2185
bool HasBase()
Определения BaseBuildingBase.c:1620
void OnSynchronizedClient()
Определения BaseBuildingBase.c:1400
void SynchronizeBaseState()
Определения BaseBuildingBase.c:1384
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:2439
ref map< string, ref AreaDamageManager > m_DamageTriggers
Определения BaseBuildingBase.c:1323
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:1625
const string SOUND_BUILD_METAL
Определения BaseBuildingBase.c:1312
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
Определения BaseBuildingBase.c:1835
override bool CanPutIntoHands(EntityAI parent)
Определения BaseBuildingBase.c:2294
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:1471
override bool CanRemoveFromCargo(EntityAI parent)
Определения BaseBuildingBase.c:2288
void ConstructionInit()
Определения BaseBuildingBase.c:2234
int m_SyncParts02
Определения BaseBuildingBase.c:1302
const string SOUND_DISMANTLE_WOOD_STAIRS
Определения BaseBuildingBase.c:1317
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
PlayerSpawnPreset slotName
ConstructionMaterialType
Определения Construction.c:2
void Construction(BaseBuildingBase parent)
Определения Construction.c:26
map
Определения ControlsXboxNew.c:4
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
void DestroyAreaDamage()
Определения FireplaceBase.c:2338
void CreateAreaDamage()
Определения FireplaceBase.c:2322
EffectSound m_Sound
Определения HungerSoundHandler.c:18
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
Определения ActionTakeItem.c:7
const int HITZONE
Определения AreaDamageManager.c:4
override void SetLoopInterval(float time)
Определения AreaDamageLooped.c:32
A particular version of the deferred loop used to not damage players inside vehicles.
override void SetDeferDuration(float time)
Определения AreaDamageLoopedDeferred.c:7
proto native World GetWorld()
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void ObjectDelete(Object obj)
Super root of all classes in Enforce script.
Определения EnScript.c:11
int GetId()
Определения ConstructionPart.c:40
string GetPartName()
Определения ConstructionPart.c:30
bool IsBase()
Определения ConstructionPart.c:65
bool IsBuilt()
Определения ConstructionPart.c:45
string m_PartName
Определения ConstructionPart.c:5
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения Debug.c:122
Определения Debug.c:2
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
Определения Building.c:6
Определения constants.c:659
proto native int GetSlot()
returns slot id if current type is Attachment
InventoryLocation.
Определения InventoryLocation.c:29
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
Определения InventorySlots.c:6
override bool CanUseConstruction()
Определения BaseBuildingBase.c:891
Определения InventoryItem.c:731
static bool IsBaseBuildingLogEnable()
Определения Debug.c:698
Определения Debug.c:594
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native void GetPlayerList(out array< Man > players)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static const vector Zero
Определения EnConvert.c:110
Определения EnConvert.c:106
override string GetDebugName()
Определения dayzplayer.c:1170
Serializer ParamsReadContext
Определения gameplay.c:15
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const int STATE_RUINED
Определения constants.c:846
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto float Cos(float angle)
Returns cosinus of angle in radians.
static proto float Sin(float angle)
Returns sinus of angle in radians.
static const float DEG2RAD
Определения EnMath.c:17
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
proto int ToLower()
Changes string to lowercase. Returns length.
const int CALL_CATEGORY_GAMEPLAY
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8

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