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

◆ CanUseConstructionBuild()

override bool bsbDebugPrint::CanUseConstructionBuild ( )
protected

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

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