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

◆ IsAttachmentSlotLocked() [2/2]

bool bsbDebugPrint::IsAttachmentSlotLocked ( string slot_name)
protected

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

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