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

◆ CanUseConstruction()

override bool bsbDebugPrint::CanUseConstruction ( )
protected

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

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

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