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

◆ GetConstruction()

Construction bsbDebugPrint::GetConstruction ( )
protected

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

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

Используется в BaseBuildingBase::AfterStoreLoad(), BaseBuildingBase::CanDisplayAttachmentCategory(), BaseBuildingBase::CanDisplayAttachmentSlot(), BaseBuildingBase::CanReceiveAttachment(), BaseBuildingBase::CheckGateState(), BaseBuildingBase::CheckSlotVerticalDistance(), ItemBase::ConstructionInit(), ItemBase::CreateAreaDamage(), ItemBase::EEHealthLevelChanged(), ItemBase::FullyBuild(), TerritoryFlag::FullyBuild(), BaseBuildingBase::GateAttachmentConditions(), BaseBuildingBase::GateAttachmentsSanityCheck(), ItemBase::GetBuildSoundByMaterial(), ItemBase::GetConstructionPartById(), ItemBase::GetDismantleSoundByMaterial(), ItemBase::InitBaseState(), ItemBase::InitVisuals(), BaseBuildingBase::OnPartBuiltServer(), ItemBase::OnPartBuiltServer(), BaseBuildingBase::OnPartDestroyedServer(), ItemBase::OnPartDestroyedServer(), BaseBuildingBase::OnPartDismantledServer(), ItemBase::OnPartDismantledServer(), ItemBase::SetPartFromSyncData(), ItemBase::SetPartsAfterStoreLoad(), ItemBase::SetPartsFromSyncData(), ItemBase::UpdatePhysics(), BaseBuildingBase::UpdateVisuals() и ItemBase::UpdateVisuals().