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

◆ GetConstruction()

Construction bsbDebugPrint::GetConstruction ( )
protected

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

2246{
2247 const string ANIMATION_DEPLOYED = "Deployed";
2248
2249 float m_ConstructionKitHealth; //stored health value for used construction kit
2250
2252
2253 bool m_HasBase;
2254 //variables for synchronization of base building parts (2x31 is the current limit)
2255 int m_SyncParts01; //synchronization for already built parts (31 parts)
2256 int m_SyncParts02; //synchronization for already built parts (+31 parts)
2257 int m_SyncParts03; //synchronization for already built parts (+31 parts)
2258 int m_InteractedPartId; //construction part id that an action was performed on
2259 int m_PerformedActionId; //action id that was performed on a construction part
2260
2261 //Sounds
2262 //build
2263 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
2264 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
2265 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
2266 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
2267 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
2268 //dismantle
2269 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
2270 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
2271 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
2272 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
2273 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
2274
2275 protected EffectSound m_Sound;
2276
2280
2281 // Constructor
2282 void BaseBuildingBase()
2283 {
2285
2286 //synchronized variables
2287 RegisterNetSyncVariableInt( "m_SyncParts01" );
2288 RegisterNetSyncVariableInt( "m_SyncParts02" );
2289 RegisterNetSyncVariableInt( "m_SyncParts03" );
2290 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2291 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2292 RegisterNetSyncVariableBool( "m_HasBase" );
2293
2294 //Construction init
2296
2297 if (ConfigIsExisting("hybridAttachments"))
2298 {
2300 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
2301 }
2302 if (ConfigIsExisting("mountables"))
2303 {
2305 ConfigGetTextArray("mountables", m_Mountables);
2306 }
2307
2308 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
2309 }
2310
2311 override void EEDelete(EntityAI parent)
2312 {
2313 super.EEDelete(parent);
2314
2315 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
2316 {
2317 areaDamage.Destroy();
2318 }
2319
2320 }
2321
2322 override string GetInvulnerabilityTypeString()
2323 {
2324 return "disableBaseDamage";
2325 }
2326
2327 override bool CanObstruct()
2328 {
2329 return true;
2330 }
2331
2332 override int GetHideIconMask()
2333 {
2334 return EInventoryIconVisibility.HIDE_VICINITY;
2335 }
2336
2337 // --- SYNCHRONIZATION
2339 {
2340 if ( GetGame().IsServer() )
2341 {
2342 SetSynchDirty();
2343 }
2344 }
2345
2346 override void OnVariablesSynchronized()
2347 {
2348 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
2349 super.OnVariablesSynchronized();
2350
2352 }
2353
2354 protected void OnSynchronizedClient()
2355 {
2356 //update parts
2358
2359 //update action on part
2361
2362 //update visuals (client)
2363 UpdateVisuals();
2364 }
2365
2366 //parts synchronization
2367 void RegisterPartForSync( int part_id )
2368 {
2369 //part_id must starts from index = 1
2370 int offset;
2371 int mask;
2372
2373 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2374 {
2375 offset = part_id - 1;
2376 mask = 1 << offset;
2377
2378 m_SyncParts01 = m_SyncParts01 | mask;
2379 }
2380 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2381 {
2382 offset = ( part_id % 32 );
2383 mask = 1 << offset;
2384
2385 m_SyncParts02 = m_SyncParts02 | mask;
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 m_SyncParts03 = m_SyncParts03 | mask;
2393 }
2394 }
2395
2396 void UnregisterPartForSync( int part_id )
2397 {
2398 //part_id must starts from index = 1
2399 int offset;
2400 int mask;
2401
2402 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2403 {
2404 offset = part_id - 1;
2405 mask = 1 << offset;
2406
2407 m_SyncParts01 = m_SyncParts01 & ~mask;
2408 }
2409 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2410 {
2411 offset = ( part_id % 32 );
2412 mask = 1 << offset;
2413
2414 m_SyncParts02 = m_SyncParts02 & ~mask;
2415 }
2416 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2417 {
2418 offset = ( part_id % 63 );
2419 mask = 1 << offset;
2420
2421 m_SyncParts03 = m_SyncParts03 & ~mask;
2422 }
2423 }
2424
2425 bool IsPartBuildInSyncData( int part_id )
2426 {
2427 //part_id must starts from index = 1
2428 int offset;
2429 int mask;
2430
2431 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2432 {
2433 offset = part_id - 1;
2434 mask = 1 << offset;
2435
2436 if ( ( m_SyncParts01 & mask ) > 0 )
2437 {
2438 return true;
2439 }
2440 }
2441 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2442 {
2443 offset = ( part_id % 32 );
2444 mask = 1 << offset;
2445
2446 if ( ( m_SyncParts02 & mask ) > 0 )
2447 {
2448 return true;
2449 }
2450 }
2451 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2452 {
2453 offset = ( part_id % 63 );
2454 mask = 1 << offset;
2455
2456 if ( ( m_SyncParts03 & mask ) > 0 )
2457 {
2458 return true;
2459 }
2460 }
2461
2462 return false;
2463 }
2464
2465 protected void RegisterActionForSync( int part_id, int action_id )
2466 {
2467 m_InteractedPartId = part_id;
2468 m_PerformedActionId = action_id;
2469 }
2470
2471 protected void ResetActionSyncData()
2472 {
2473 //reset data
2474 m_InteractedPartId = -1;
2476 }
2477
2478 protected void SetActionFromSyncData()
2479 {
2480 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
2481 {
2483 int build_action_id = m_PerformedActionId;
2484
2485 switch( build_action_id )
2486 {
2487 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
2488 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
2489 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
2490 }
2491 }
2492 }
2493 //------
2494
2496 {
2497 string key = part.m_PartName;
2498 bool is_base = part.IsBase();
2499 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
2500 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
2501 if ( is_part_built_sync )
2502 {
2503 if ( !part.IsBuilt() )
2504 {
2505 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
2506 GetConstruction().AddToConstructedParts( key );
2507 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
2508
2509 if (is_base)
2510 {
2512 RemoveProxyPhysics( ANIMATION_DEPLOYED );
2513 }
2514 }
2515 }
2516 else
2517 {
2518 if ( part.IsBuilt() )
2519 {
2520 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
2521 GetConstruction().RemoveFromConstructedParts( key );
2522 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
2523
2524 if (is_base)
2525 {
2527 AddProxyPhysics( ANIMATION_DEPLOYED );
2528 }
2529 }
2530 }
2531
2532 //check slot lock for material attachments
2533 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
2534 }
2535
2536 //set construction parts based on synchronized data
2538 {
2539 Construction construction = GetConstruction();
2540 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2541
2542 for ( int i = 0; i < construction_parts.Count(); ++i )
2543 {
2544 string key = construction_parts.GetKey( i );
2545 ConstructionPart value = construction_parts.Get( key );
2546 SetPartFromSyncData(value);
2547 }
2548
2549 //regenerate navmesh
2550 UpdateNavmesh();
2551 }
2552
2553 protected ConstructionPart GetConstructionPartById( int id )
2554 {
2555 Construction construction = GetConstruction();
2556 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2557
2558 for ( int i = 0; i < construction_parts.Count(); ++i )
2559 {
2560 string key = construction_parts.GetKey( i );
2561 ConstructionPart value = construction_parts.Get( key );
2562
2563 if ( value.GetId() == id )
2564 {
2565 return value;
2566 }
2567 }
2568
2569 return NULL;
2570 }
2571 //
2572
2573 //Base
2574 bool HasBase()
2575 {
2576 return m_HasBase;
2577 }
2578
2579 void SetBaseState( bool has_base )
2580 {
2581 m_HasBase = has_base;
2582 }
2583
2584 override bool IsDeployable()
2585 {
2586 return true;
2587 }
2588
2589 bool IsOpened()
2590 {
2591 return false;
2592 }
2593
2594 //--- CONSTRUCTION KIT
2596 {
2597 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
2598 if ( m_ConstructionKitHealth > 0 )
2599 {
2600 construction_kit.SetHealth( m_ConstructionKitHealth );
2601 }
2602
2603 return construction_kit;
2604 }
2605
2606 void CreateConstructionKitInHands(notnull PlayerBase player)
2607 {
2608 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2609 if ( m_ConstructionKitHealth > 0 )
2610 {
2611 construction_kit.SetHealth( m_ConstructionKitHealth );
2612 }
2613 }
2614
2615 protected vector GetKitSpawnPosition()
2616 {
2617 return GetPosition();
2618 }
2619
2620 protected string GetConstructionKitType()
2621 {
2622 return "";
2623 }
2624
2625 void DestroyConstructionKit( ItemBase construction_kit )
2626 {
2627 m_ConstructionKitHealth = construction_kit.GetHealth();
2628 GetGame().ObjectDelete( construction_kit );
2629 }
2630
2631 //--- CONSTRUCTION
2632 void DestroyConstruction()
2633 {
2634 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2635 GetGame().ObjectDelete( this );
2636 }
2637
2638 // --- EVENTS
2639 override void OnStoreSave( ParamsWriteContext ctx )
2640 {
2641 super.OnStoreSave( ctx );
2642
2643 //sync parts 01
2644 ctx.Write( m_SyncParts01 );
2645 ctx.Write( m_SyncParts02 );
2646 ctx.Write( m_SyncParts03 );
2647
2648 ctx.Write( m_HasBase );
2649 }
2650
2651 override bool OnStoreLoad( ParamsReadContext ctx, int version )
2652 {
2653 if ( !super.OnStoreLoad( ctx, version ) )
2654 return false;
2655
2656 //--- Base building data ---
2657 //Restore synced parts data
2658 if ( !ctx.Read( m_SyncParts01 ) )
2659 {
2660 m_SyncParts01 = 0; //set default
2661 return false;
2662 }
2663 if ( !ctx.Read( m_SyncParts02 ) )
2664 {
2665 m_SyncParts02 = 0; //set default
2666 return false;
2667 }
2668 if ( !ctx.Read( m_SyncParts03 ) )
2669 {
2670 m_SyncParts03 = 0; //set default
2671 return false;
2672 }
2673
2674 //has base
2675 if ( !ctx.Read( m_HasBase ) )
2676 {
2677 m_HasBase = false;
2678 return false;
2679 }
2680 //---
2681
2682 return true;
2683 }
2684
2685 override void AfterStoreLoad()
2686 {
2687 super.AfterStoreLoad();
2688
2690 {
2692 }
2693 }
2694
2696 {
2697 //update server data
2699
2700 //set base state
2701 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
2702 SetBaseState( construction_part.IsBuilt() ) ;
2703
2704 //synchronize after load
2706 }
2707
2708 override void OnCreatePhysics()
2709 {
2710 super.OnCreatePhysics();
2713 }
2714
2715 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2716 {
2718 return;
2719
2720 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2721
2722 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
2723 return;
2724
2725 Construction construction = GetConstruction();
2726 string part_name = zone;
2727 part_name.ToLower();
2728
2729 if ( newLevel == GameConstants.STATE_RUINED )
2730 {
2731 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2732
2733 if ( construction_part && construction.IsPartConstructed( part_name ) )
2734 {
2735 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
2736 construction.DestroyConnectedParts(part_name);
2737 }
2738
2739 //barbed wire handling (hack-ish)
2740 if ( part_name.Contains("barbed") )
2741 {
2742 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2743 if (barbed_wire)
2744 barbed_wire.SetMountedState( false );
2745 }
2746 }
2747 }
2748
2749 override void EEOnAfterLoad()
2750 {
2752 {
2754 }
2755
2756 super.EEOnAfterLoad();
2757 }
2758
2759 override void EEInit()
2760 {
2761 super.EEInit();
2762
2763 // init visuals and physics
2764 InitBaseState();
2765
2766 //debug
2767 #ifdef DEVELOPER
2769 #endif
2770 }
2771
2772 override void EEItemAttached( EntityAI item, string slot_name )
2773 {
2774 super.EEItemAttached( item, slot_name );
2775
2776 CheckForHybridAttachments( item, slot_name );
2777 UpdateVisuals();
2778 UpdateAttachmentPhysics( slot_name, false );
2779 }
2780
2781 override void EEItemDetached( EntityAI item, string slot_name )
2782 {
2783 super.EEItemDetached( item, slot_name );
2784
2785 UpdateVisuals();
2786 UpdateAttachmentPhysics( slot_name, false );
2787 }
2788
2789 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
2790 {
2791 string slot_name = InventorySlots.GetSlotName( slotId );
2792 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
2793
2794 UpdateAttachmentVisuals( slot_name, locked );
2795 UpdateAttachmentPhysics( slot_name, locked );
2796 }
2797
2798 //ignore out of reach condition
2799 override bool IgnoreOutOfReachCondition()
2800 {
2801 return true;
2802 }
2803
2804 //CONSTRUCTION EVENTS
2805 //Build
2806 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
2807 {
2808 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2809
2810 //check base state
2811 if (construtionPart.IsBase())
2812 {
2813 SetBaseState(true);
2814
2815 //spawn kit
2817 }
2818
2819 //register constructed parts for synchronization
2820 RegisterPartForSync(construtionPart.GetId());
2821
2822 //register action that was performed on part
2823 RegisterActionForSync(construtionPart.GetId(), action_id);
2824
2825 //synchronize
2827
2828 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
2829
2830 UpdateNavmesh();
2831
2832 //update visuals
2833 UpdateVisuals();
2834
2835 //reset action sync data
2837 }
2838
2839 void OnPartBuiltClient(string part_name, int action_id)
2840 {
2841 //play sound
2842 SoundBuildStart( part_name );
2843 }
2844
2845 //Dismantle
2846 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
2847 {
2848 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
2849 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2850
2851 //register constructed parts for synchronization
2852 UnregisterPartForSync(construtionPart.GetId());
2853
2854 //register action that was performed on part
2855 RegisterActionForSync(construtionPart.GetId(), action_id);
2856
2857 //synchronize
2859
2860 // server part of sync, client will be synced from SetPartsFromSyncData
2861 SetPartFromSyncData(construtionPart);
2862
2863 UpdateNavmesh();
2864
2865 //update visuals
2866 UpdateVisuals();
2867
2868 //reset action sync data
2870
2871 //check base state
2872 if (construtionPart.IsBase())
2873 {
2874 //Destroy construction
2876 }
2877
2878 if (GetGame().IsServer())
2879 HandleItemFalling(construtionPart);
2880 }
2881
2882 void OnPartDismantledClient( string part_name, int action_id )
2883 {
2884 //play sound
2885 SoundDismantleStart( part_name );
2886 }
2887
2888 //Destroy
2889 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
2890 {
2891 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
2892 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2893
2894 //register constructed parts for synchronization
2895 UnregisterPartForSync(construtionPart.GetId());
2896
2897 //register action that was performed on part
2898 RegisterActionForSync(construtionPart.GetId(), action_id);
2899
2900 //synchronize
2902
2903 // server part of sync, client will be synced from SetPartsFromSyncData
2904 SetPartFromSyncData(construtionPart);
2905
2906 UpdateNavmesh();
2907
2908 //update visuals
2909 UpdateVisuals();
2910
2911 //reset action sync data
2913
2914 //check base state
2915 if (construtionPart.IsBase())
2916 {
2917 //Destroy construction
2919 }
2920
2921 if (GetGame().IsServer())
2922 HandleItemFalling(construtionPart);
2923 }
2924
2925 void OnPartDestroyedClient( string part_name, int action_id )
2926 {
2927 //play sound
2928 SoundDestroyStart( part_name );
2929 }
2930
2931 protected void HandleItemFalling(ConstructionPart part)
2932 {
2933 bool process = false;
2934
2935 //TODO: add a parameter to parts' config classes?
2936 process |= part.m_PartName.Contains("_roof");
2937 process |= part.m_PartName.Contains("_platform");
2938 process |= part.m_PartName.Contains("_stair");
2939
2940 if (process)
2941 {
2942 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
2943 {
2944 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
2945 return;
2946 }
2947
2948 vector mins, maxs;
2949 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
2950 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
2951
2952 //sanitize minmaxs
2953 vector minTmp, maxTmp;
2954 minTmp[0] = Math.Min(mins[0],maxs[0]);
2955 maxTmp[0] = Math.Max(mins[0],maxs[0]);
2956 minTmp[1] = Math.Min(mins[1],maxs[1]);
2957 maxTmp[1] = Math.Max(mins[1],maxs[1]);
2958 minTmp[2] = Math.Min(mins[2],maxs[2]);
2959 maxTmp[2] = Math.Max(mins[2],maxs[2]);
2960 mins = minTmp;
2961 maxs = maxTmp;
2962
2963 maxs[1] = maxs[1] + 0.35; //reach a little above..
2964
2965 ItemFall(mins,maxs);
2966 }
2967 }
2968
2969 protected void ItemFall(vector min, vector max)
2970 {
2971 array<EntityAI> foundEntities = new array<EntityAI>();
2972 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
2973
2974 //filtering
2975 ItemBase item;
2976 foreach (EntityAI entity : foundEntities)
2977 {
2978 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
2979 item.ThrowPhysically(null,vector.Zero);
2980 }
2981 }
2982
2983 // --- UPDATE
2984 void InitBaseState()
2985 {
2986 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
2987
2988 InitVisuals();
2989 UpdateNavmesh(); //regenerate navmesh
2990 GetConstruction().InitBaseState();
2991 }
2992
2993 void InitVisuals()
2994 {
2995 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
2996 //check base
2997 if ( !HasBase() )
2998 {
2999 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
3000 }
3001 else
3002 {
3003 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
3004 }
3005
3006 GetConstruction().UpdateVisuals();
3007 }
3008
3009 void UpdateVisuals()
3010 {
3011 array<string> attachmentSlots = new array<string>;
3012
3013 GetAttachmentSlots(this, attachmentSlots);
3014 foreach (string slotName : attachmentSlots)
3015 {
3017 }
3018
3019 //check base
3020 if (!HasBase())
3021 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
3022 else
3023 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
3024
3025 GetConstruction().UpdateVisuals();
3026 }
3027
3028 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
3029 {
3030 string slotNameMounted = slot_name + "_Mounted";
3031 EntityAI attachment = FindAttachmentBySlotName(slot_name);
3032
3033 if (attachment)
3034 {
3035 BarbedWire barbedWire = BarbedWire.Cast(attachment);
3036 if (barbedWire && barbedWire.IsMounted())
3037 CreateAreaDamage(slotNameMounted);
3038 else
3039 DestroyAreaDamage(slotNameMounted);
3040
3041 if (is_locked)
3042 {
3043 SetAnimationPhase(slotNameMounted, 0);
3044 SetAnimationPhase(slot_name, 1);
3045 }
3046 else
3047 {
3048 SetAnimationPhase(slotNameMounted, 1);
3049 SetAnimationPhase(slot_name, 0);
3050 }
3051 }
3052 else
3053 {
3054 SetAnimationPhase(slotNameMounted, 1);
3055 SetAnimationPhase(slot_name, 1);
3056
3057 DestroyAreaDamage(slotNameMounted);
3058 }
3059 }
3060
3061 // avoid calling this function on frequent occasions, it's a massive performance hit
3062 void UpdatePhysics()
3063 {
3065 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
3066
3067 array<string> attachmentSlots = new array<string>;
3068 GetAttachmentSlots(this, attachmentSlots);
3069
3071 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
3072
3073 foreach (string slotName : attachmentSlots)
3074 {
3076 }
3077
3078 //check base
3079 if (!HasBase())
3080 {
3082 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
3083
3084 AddProxyPhysics(ANIMATION_DEPLOYED);
3085 }
3086 else
3087 {
3089 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
3090
3091 RemoveProxyPhysics(ANIMATION_DEPLOYED);
3092 }
3093
3094 GetConstruction().UpdatePhysics();
3095 UpdateNavmesh();
3096 }
3097
3098 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
3099 {
3100 //checks for invalid appends; hotfix
3101 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
3102 return;
3103 //----------------------------------
3104 string slot_name_mounted = slot_name + "_Mounted";
3105 EntityAI attachment = FindAttachmentBySlotName( slot_name );
3106
3107 //remove proxy physics
3108 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
3109 RemoveProxyPhysics( slot_name_mounted );
3110 RemoveProxyPhysics( slot_name );
3111
3112 if ( attachment )
3113 {
3114 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
3115 if ( is_locked )
3116 {
3117 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
3118 AddProxyPhysics( slot_name_mounted );
3119 }
3120 else
3121 {
3122 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
3123 AddProxyPhysics( slot_name );
3124 }
3125 }
3126 }
3127
3128 protected void UpdateNavmesh()
3129 {
3130 SetAffectPathgraph( true, false );
3131 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
3132 }
3133
3134 override bool CanUseConstruction()
3135 {
3136 return true;
3137 }
3138
3139 override bool CanUseConstructionBuild()
3140 {
3141 return true;
3142 }
3143
3144 protected bool IsAttachmentSlotLocked( EntityAI attachment )
3145 {
3146 if ( attachment )
3147 {
3148 InventoryLocation inventory_location = new InventoryLocation;
3149 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3150
3151 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
3152 }
3153
3154 return false;
3155 }
3156
3157 protected bool IsAttachmentSlotLocked( string slot_name )
3158 {
3159 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
3160 }
3161
3162 //--- ATTACHMENT SLOTS
3163 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
3164 {
3165 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3166 if ( GetGame().ConfigIsExisting( config_path ) )
3167 {
3168 GetGame().ConfigGetTextArray( config_path, attachment_slots );
3169 }
3170 }
3171
3172 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
3173 {
3174 return true;
3175 }
3176
3177 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
3178 {
3179 return true;
3180 }
3181
3182 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
3183 {
3184 return true;
3185 }
3186
3187 // --- INIT
3188 void ConstructionInit()
3189 {
3190 if ( !m_Construction )
3191 {
3192 m_Construction = new Construction( this );
3193 }
3194
3195 GetConstruction().Init();
3196 }
3197
3199 {
3200 return m_Construction;
3201 }
3202
3203 //--- INVENTORY/ATTACHMENTS CONDITIONS
3204 //attachments
3205 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
3206 {
3207 return super.CanReceiveAttachment(attachment, slotId);
3208 }
3209
3211 {
3212 int attachment_count = GetInventory().AttachmentCount();
3213 if ( attachment_count > 0 )
3214 {
3215 if ( HasBase() && attachment_count == 1 )
3216 {
3217 return false;
3218 }
3219
3220 return true;
3221 }
3222
3223 return false;
3224 }
3225
3226 override bool ShowZonesHealth()
3227 {
3228 return true;
3229 }
3230
3231 override bool IsTakeable()
3232 {
3233 return false;
3234 }
3235
3236 //this into/outo parent.Cargo
3237 override bool CanPutInCargo( EntityAI parent )
3238 {
3239 return false;
3240 }
3241
3242 override bool CanRemoveFromCargo( EntityAI parent )
3243 {
3244 return false;
3245 }
3246
3247 //hands
3248 override bool CanPutIntoHands( EntityAI parent )
3249 {
3250 return false;
3251 }
3252
3253 //--- ACTION CONDITIONS
3254 //direction
3255 override bool IsFacingPlayer( PlayerBase player, string selection )
3256 {
3257 return true;
3258 }
3259
3260 override bool IsPlayerInside( PlayerBase player, string selection )
3261 {
3262 return true;
3263 }
3264
3267 {
3268 return false;
3269 }
3270
3271 //camera direction check
3272 bool IsFacingCamera( string selection )
3273 {
3274 return true;
3275 }
3276
3277 //roof check
3278 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
3279 {
3280 return false;
3281 }
3282
3283 //selection->player distance check
3284 bool HasProperDistance( string selection, PlayerBase player )
3285 {
3286 return true;
3287 }
3288
3289 //folding
3291 {
3292 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
3293 {
3294 return false;
3295 }
3296
3297 return true;
3298 }
3299
3301 {
3304
3305 return item;
3306 }
3307
3308 //Damage triggers (barbed wire)
3309 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
3310 {
3311 if ( GetGame() && GetGame().IsServer() )
3312 {
3313 //destroy area damage if some already exists
3314 DestroyAreaDamage( slot_name );
3315
3316 //create new area damage
3318 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
3319
3320 vector min_max[2];
3321 if ( MemoryPointExists( slot_name + "_min" ) )
3322 {
3323 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3324 }
3325 if ( MemoryPointExists( slot_name + "_max" ) )
3326 {
3327 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3328 }
3329
3330 //get proper trigger extents (min<max)
3331 vector extents[2];
3332 GetConstruction().GetTriggerExtents( min_max, extents );
3333
3334 //get box center
3335 vector center;
3336 center = GetConstruction().GetBoxCenter( min_max );
3337 center = ModelToWorld( center );
3338
3339 //rotate center if needed
3340 vector orientation = GetOrientation();;
3341 CalcDamageAreaRotation( rotation_angle, center, orientation );
3342
3343 areaDamage.SetExtents( extents[0], extents[1] );
3344 areaDamage.SetAreaPosition( center );
3345 areaDamage.SetAreaOrientation( orientation );
3346 areaDamage.SetLoopInterval( 1.0 );
3347 areaDamage.SetDeferDuration( 0.2 );
3348 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3349 areaDamage.SetAmmoName( "BarbedWireHit" );
3350 areaDamage.Spawn();
3351
3352 m_DamageTriggers.Insert( slot_name, areaDamage );
3353 }
3354 }
3355
3356 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
3357 {
3358 if ( angle_deg != 0 )
3359 {
3360 //orientation
3361 orientation[0] = orientation[0] - angle_deg;
3362
3363 //center
3364 vector rotate_axis;
3365 if ( MemoryPointExists( "rotate_axis" ) )
3366 {
3367 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3368 }
3369 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];
3370 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];
3371 center[0] = r_center_x;
3372 center[2] = r_center_z;
3373 }
3374 }
3375
3376 void DestroyAreaDamage( string slot_name )
3377 {
3378 if (GetGame() && GetGame().IsServer())
3379 {
3381 if (m_DamageTriggers.Find(slot_name, areaDamage))
3382 {
3383 if (areaDamage)
3384 {
3385 areaDamage.Destroy();
3386 }
3387
3388 m_DamageTriggers.Remove( slot_name );
3389 }
3390 }
3391 }
3392
3393 override bool IsIgnoredByConstruction()
3394 {
3395 return true;
3396 }
3397
3398 //================================================================
3399 // SOUNDS
3400 //================================================================
3401 protected void SoundBuildStart( string part_name )
3402 {
3403 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
3404 }
3405
3406 protected void SoundDismantleStart( string part_name )
3407 {
3408 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3409 }
3410
3411 protected void SoundDestroyStart( string part_name )
3412 {
3413 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3414 }
3415
3416 protected string GetBuildSoundByMaterial( string part_name )
3417 {
3418 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3419
3420 switch ( material_type )
3421 {
3422 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
3423 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
3424 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
3425 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
3426 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
3427 }
3428
3429 return "";
3430 }
3431
3432 protected string GetDismantleSoundByMaterial( string part_name )
3433 {
3434 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3435
3436 switch ( material_type )
3437 {
3438 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
3439 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
3440 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
3441 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
3442 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
3443 }
3444
3445 return "";
3446 }
3447
3448 //misc
3449 void CheckForHybridAttachments( EntityAI item, string slot_name )
3450 {
3451 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
3452 {
3453 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
3454 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
3455 {
3456 SetHealth(slot_name,"Health",item.GetHealth());
3457 }
3458 }
3459 }
3460
3461 override int GetDamageSystemVersionChange()
3462 {
3463 return 111;
3464 }
3465
3466 override void SetActions()
3467 {
3468 super.SetActions();
3469
3473 }
3474
3475 //================================================================
3476 // DEBUG
3477 //================================================================
3478 protected void DebugCustomState()
3479 {
3480 }
3481
3484 {
3485 return null;
3486 }
3487
3488 override void OnDebugSpawn()
3489 {
3490 FullyBuild();
3491 }
3492
3493 void FullyBuild()
3494 {
3496 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
3497
3498 Man p;
3499
3500 #ifdef SERVER
3501 array<Man> players = new array<Man>;
3502 GetGame().GetWorld().GetPlayerList(players);
3503 if (players.Count())
3504 p = players[0];
3505 #else
3506 p = GetGame().GetPlayer();
3507 #endif
3508
3509 foreach (ConstructionPart part : parts)
3510 {
3511 bool excluded = false;
3512 string partName = part.GetPartName();
3513 if (excludes)
3514 {
3515 foreach (string exclude : excludes)
3516 {
3517 if (partName.Contains(exclude))
3518 {
3519 excluded = true;
3520 break;
3521 }
3522 }
3523 }
3524
3525 if (!excluded)
3526 {
3527 OnPartBuiltServer(p, partName, AT_BUILD_PART);
3528 }
3529 }
3530
3531 GetConstruction().UpdateVisuals();
3532 }
3533}
3534
3535void bsbDebugPrint (string s)
3536{
3537#ifdef BSB_DEBUG
3538 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3539#else
3540 //Print("" + s); // comment/uncomment to hide/see debug logs
3541#endif
3542}
3543void bsbDebugSpam (string s)
3544{
3545#ifdef BSB_DEBUG_SPAM
3546 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3547#else
3548 //Print("" + s); // comment/uncomment to hide/see debug logs
3549#endif
3550}
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

Используется в BaseBuildingBase::AfterStoreLoad(), BaseBuildingBase::CanDisplayAttachmentCategory(), BaseBuildingBase::CanDisplayAttachmentSlot(), BaseBuildingBase::CanReceiveAttachment(), BaseBuildingBase::CheckGateState(), BaseBuildingBase::CheckSlotVerticalDistance(), ItemBase::ConstructionInit(), ItemBase::CreateAreaDamage(), ItemBase::EEHealthLevelChanged(), ItemBase::FullyBuild(), TerritoryFlag::FullyBuild(), BaseBuildingBase::GateAttachmentConditions(), BaseBuildingBase::GateAttachmentsSanityCheck(), ItemBase::GetBuildSoundByMaterial(), ItemBase::GetConstructionPartById(), ItemBase::GetDismantleSoundByMaterial(), ItemBase::InitBaseState(), ItemBase::InitVisuals(), BaseBuildingBase::OnPartBuiltServer(), ItemBase::OnPartBuiltServer(), BaseBuildingBase::OnPartDestroyedServer(), ItemBase::OnPartDestroyedServer(), BaseBuildingBase::OnPartDismantledServer(), ItemBase::OnPartDismantledServer(), ItemBase::SetPartFromSyncData(), ItemBase::SetPartsAfterStoreLoad(), ItemBase::SetPartsFromSyncData(), ItemBase::UpdatePhysics(), BaseBuildingBase::UpdateVisuals() и ItemBase::UpdateVisuals().