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

◆ GetAttachmentSlots()

void bsbDebugPrint::GetAttachmentSlots ( EntityAI entity,
out array< string > attachment_slots )
protected

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

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

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