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

◆ CanUseConstructionBuild()

override bool bsbDebugPrint::CanUseConstructionBuild ( )
protected

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

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