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

◆ HasAttachmentsBesidesBase()

bool bsbDebugPrint::HasAttachmentsBesidesBase ( )
protected

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

2258{
2259 const string ANIMATION_DEPLOYED = "Deployed";
2260
2261 float m_ConstructionKitHealth; //stored health value for used construction kit
2262
2264
2265 bool m_HasBase;
2266 //variables for synchronization of base building parts (2x31 is the current limit)
2267 int m_SyncParts01; //synchronization for already built parts (31 parts)
2268 int m_SyncParts02; //synchronization for already built parts (+31 parts)
2269 int m_SyncParts03; //synchronization for already built parts (+31 parts)
2270 int m_InteractedPartId; //construction part id that an action was performed on
2271 int m_PerformedActionId; //action id that was performed on a construction part
2272
2273 //Sounds
2274 //build
2275 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
2276 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
2277 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
2278 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
2279 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
2280 //dismantle
2281 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
2282 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
2283 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
2284 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
2285 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
2286
2287 protected EffectSound m_Sound;
2288
2292
2293 // Constructor
2294 void BaseBuildingBase()
2295 {
2297
2298 //synchronized variables
2299 RegisterNetSyncVariableInt( "m_SyncParts01" );
2300 RegisterNetSyncVariableInt( "m_SyncParts02" );
2301 RegisterNetSyncVariableInt( "m_SyncParts03" );
2302 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2303 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2304 RegisterNetSyncVariableBool( "m_HasBase" );
2305
2306 //Construction init
2308
2309 if (ConfigIsExisting("hybridAttachments"))
2310 {
2312 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
2313 }
2314 if (ConfigIsExisting("mountables"))
2315 {
2317 ConfigGetTextArray("mountables", m_Mountables);
2318 }
2319
2320 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
2321 }
2322
2323 override void EEDelete(EntityAI parent)
2324 {
2325 super.EEDelete(parent);
2326
2327 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
2328 {
2329 areaDamage.Destroy();
2330 }
2331
2332 }
2333
2334 override string GetInvulnerabilityTypeString()
2335 {
2336 return "disableBaseDamage";
2337 }
2338
2339 override bool CanObstruct()
2340 {
2341 return true;
2342 }
2343
2344 override int GetHideIconMask()
2345 {
2346 return EInventoryIconVisibility.HIDE_VICINITY;
2347 }
2348
2349 // --- SYNCHRONIZATION
2351 {
2352 if ( GetGame().IsServer() )
2353 {
2354 SetSynchDirty();
2355 }
2356 }
2357
2358 override void OnVariablesSynchronized()
2359 {
2360 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
2361 super.OnVariablesSynchronized();
2362
2364 }
2365
2366 protected void OnSynchronizedClient()
2367 {
2368 //update parts
2370
2371 //update action on part
2373
2374 //update visuals (client)
2375 UpdateVisuals();
2376 }
2377
2378 //parts synchronization
2379 void RegisterPartForSync( int part_id )
2380 {
2381 //part_id must starts from index = 1
2382 int offset;
2383 int mask;
2384
2385 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2386 {
2387 offset = part_id - 1;
2388 mask = 1 << offset;
2389
2390 m_SyncParts01 = m_SyncParts01 | mask;
2391 }
2392 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2393 {
2394 offset = ( part_id % 32 );
2395 mask = 1 << offset;
2396
2397 m_SyncParts02 = m_SyncParts02 | mask;
2398 }
2399 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2400 {
2401 offset = ( part_id % 63 );
2402 mask = 1 << offset;
2403
2404 m_SyncParts03 = m_SyncParts03 | mask;
2405 }
2406 }
2407
2408 void UnregisterPartForSync( int part_id )
2409 {
2410 //part_id must starts from index = 1
2411 int offset;
2412 int mask;
2413
2414 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2415 {
2416 offset = part_id - 1;
2417 mask = 1 << offset;
2418
2419 m_SyncParts01 = m_SyncParts01 & ~mask;
2420 }
2421 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2422 {
2423 offset = ( part_id % 32 );
2424 mask = 1 << offset;
2425
2426 m_SyncParts02 = m_SyncParts02 & ~mask;
2427 }
2428 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2429 {
2430 offset = ( part_id % 63 );
2431 mask = 1 << offset;
2432
2433 m_SyncParts03 = m_SyncParts03 & ~mask;
2434 }
2435 }
2436
2437 bool IsPartBuildInSyncData( int part_id )
2438 {
2439 //part_id must starts from index = 1
2440 int offset;
2441 int mask;
2442
2443 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2444 {
2445 offset = part_id - 1;
2446 mask = 1 << offset;
2447
2448 if ( ( m_SyncParts01 & mask ) > 0 )
2449 {
2450 return true;
2451 }
2452 }
2453 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2454 {
2455 offset = ( part_id % 32 );
2456 mask = 1 << offset;
2457
2458 if ( ( m_SyncParts02 & mask ) > 0 )
2459 {
2460 return true;
2461 }
2462 }
2463 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2464 {
2465 offset = ( part_id % 63 );
2466 mask = 1 << offset;
2467
2468 if ( ( m_SyncParts03 & mask ) > 0 )
2469 {
2470 return true;
2471 }
2472 }
2473
2474 return false;
2475 }
2476
2477 protected void RegisterActionForSync( int part_id, int action_id )
2478 {
2479 m_InteractedPartId = part_id;
2480 m_PerformedActionId = action_id;
2481 }
2482
2483 protected void ResetActionSyncData()
2484 {
2485 //reset data
2486 m_InteractedPartId = -1;
2488 }
2489
2490 protected void SetActionFromSyncData()
2491 {
2492 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
2493 {
2495 int build_action_id = m_PerformedActionId;
2496
2497 switch( build_action_id )
2498 {
2499 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
2500 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
2501 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
2502 }
2503 }
2504 }
2505 //------
2506
2508 {
2509 string key = part.m_PartName;
2510 bool is_base = part.IsBase();
2511 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
2512 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
2513 if ( is_part_built_sync )
2514 {
2515 if ( !part.IsBuilt() )
2516 {
2517 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
2518 GetConstruction().AddToConstructedParts( key );
2519 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
2520
2521 if (is_base)
2522 {
2524 RemoveProxyPhysics( ANIMATION_DEPLOYED );
2525 }
2526 }
2527 }
2528 else
2529 {
2530 if ( part.IsBuilt() )
2531 {
2532 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
2533 GetConstruction().RemoveFromConstructedParts( key );
2534 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
2535
2536 if (is_base)
2537 {
2539 AddProxyPhysics( ANIMATION_DEPLOYED );
2540 }
2541 }
2542 }
2543
2544 //check slot lock for material attachments
2545 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
2546 }
2547
2548 //set construction parts based on synchronized data
2550 {
2551 Construction construction = GetConstruction();
2552 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2553
2554 for ( int i = 0; i < construction_parts.Count(); ++i )
2555 {
2556 string key = construction_parts.GetKey( i );
2557 ConstructionPart value = construction_parts.Get( key );
2558 SetPartFromSyncData(value);
2559 }
2560
2561 //regenerate navmesh
2562 UpdateNavmesh();
2563 }
2564
2565 protected ConstructionPart GetConstructionPartById( int id )
2566 {
2567 Construction construction = GetConstruction();
2568 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2569
2570 for ( int i = 0; i < construction_parts.Count(); ++i )
2571 {
2572 string key = construction_parts.GetKey( i );
2573 ConstructionPart value = construction_parts.Get( key );
2574
2575 if ( value.GetId() == id )
2576 {
2577 return value;
2578 }
2579 }
2580
2581 return NULL;
2582 }
2583 //
2584
2585 //Base
2586 bool HasBase()
2587 {
2588 return m_HasBase;
2589 }
2590
2591 void SetBaseState( bool has_base )
2592 {
2593 m_HasBase = has_base;
2594 }
2595
2596 override bool IsDeployable()
2597 {
2598 return true;
2599 }
2600
2601 bool IsOpened()
2602 {
2603 return false;
2604 }
2605
2606 //--- CONSTRUCTION KIT
2608 {
2609 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
2610 if ( m_ConstructionKitHealth > 0 )
2611 {
2612 construction_kit.SetHealth( m_ConstructionKitHealth );
2613 }
2614
2615 return construction_kit;
2616 }
2617
2618 void CreateConstructionKitInHands(notnull PlayerBase player)
2619 {
2620 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2621 if ( m_ConstructionKitHealth > 0 )
2622 {
2623 construction_kit.SetHealth( m_ConstructionKitHealth );
2624 }
2625 }
2626
2627 protected vector GetKitSpawnPosition()
2628 {
2629 return GetPosition();
2630 }
2631
2632 protected string GetConstructionKitType()
2633 {
2634 return "";
2635 }
2636
2637 void DestroyConstructionKit( ItemBase construction_kit )
2638 {
2639 m_ConstructionKitHealth = construction_kit.GetHealth();
2640 GetGame().ObjectDelete( construction_kit );
2641 }
2642
2643 //--- CONSTRUCTION
2644 void DestroyConstruction()
2645 {
2646 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2647 GetGame().ObjectDelete( this );
2648 }
2649
2650 // --- EVENTS
2651 override void OnStoreSave( ParamsWriteContext ctx )
2652 {
2653 super.OnStoreSave( ctx );
2654
2655 //sync parts 01
2656 ctx.Write( m_SyncParts01 );
2657 ctx.Write( m_SyncParts02 );
2658 ctx.Write( m_SyncParts03 );
2659
2660 ctx.Write( m_HasBase );
2661 }
2662
2663 override bool OnStoreLoad( ParamsReadContext ctx, int version )
2664 {
2665 if ( !super.OnStoreLoad( ctx, version ) )
2666 return false;
2667
2668 //--- Base building data ---
2669 //Restore synced parts data
2670 if ( !ctx.Read( m_SyncParts01 ) )
2671 {
2672 m_SyncParts01 = 0; //set default
2673 return false;
2674 }
2675 if ( !ctx.Read( m_SyncParts02 ) )
2676 {
2677 m_SyncParts02 = 0; //set default
2678 return false;
2679 }
2680 if ( !ctx.Read( m_SyncParts03 ) )
2681 {
2682 m_SyncParts03 = 0; //set default
2683 return false;
2684 }
2685
2686 //has base
2687 if ( !ctx.Read( m_HasBase ) )
2688 {
2689 m_HasBase = false;
2690 return false;
2691 }
2692 //---
2693
2694 return true;
2695 }
2696
2697 override void AfterStoreLoad()
2698 {
2699 super.AfterStoreLoad();
2700
2702 {
2704 }
2705 }
2706
2708 {
2709 //update server data
2711
2712 //set base state
2713 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
2714 SetBaseState( construction_part.IsBuilt() ) ;
2715
2716 //synchronize after load
2718 }
2719
2720 override void OnCreatePhysics()
2721 {
2722 super.OnCreatePhysics();
2725 }
2726
2727 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2728 {
2730 return;
2731
2732 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2733
2734 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
2735 return;
2736
2737 Construction construction = GetConstruction();
2738 string part_name = zone;
2739 part_name.ToLower();
2740
2741 if ( newLevel == GameConstants.STATE_RUINED )
2742 {
2743 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2744
2745 if ( construction_part && construction.IsPartConstructed( part_name ) )
2746 {
2747 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
2748 construction.DestroyConnectedParts(part_name);
2749 }
2750
2751 //barbed wire handling (hack-ish)
2752 if ( part_name.Contains("barbed") )
2753 {
2754 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2755 if (barbed_wire)
2756 barbed_wire.SetMountedState( false );
2757 }
2758 }
2759 }
2760
2761 override void EEOnAfterLoad()
2762 {
2764 {
2766 }
2767
2768 super.EEOnAfterLoad();
2769 }
2770
2771 override void EEInit()
2772 {
2773 super.EEInit();
2774
2775 // init visuals and physics
2776 InitBaseState();
2777
2778 //debug
2779 #ifdef DEVELOPER
2781 #endif
2782 }
2783
2784 override void EEItemAttached( EntityAI item, string slot_name )
2785 {
2786 super.EEItemAttached( item, slot_name );
2787
2788 CheckForHybridAttachments( item, slot_name );
2789 UpdateVisuals();
2790 UpdateAttachmentPhysics( slot_name, false );
2791 }
2792
2793 override void EEItemDetached( EntityAI item, string slot_name )
2794 {
2795 super.EEItemDetached( item, slot_name );
2796
2797 UpdateVisuals();
2798 UpdateAttachmentPhysics( slot_name, false );
2799 }
2800
2801 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
2802 {
2803 string slot_name = InventorySlots.GetSlotName( slotId );
2804 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
2805
2806 UpdateAttachmentVisuals( slot_name, locked );
2807 UpdateAttachmentPhysics( slot_name, locked );
2808 }
2809
2810 //ignore out of reach condition
2811 override bool IgnoreOutOfReachCondition()
2812 {
2813 return true;
2814 }
2815
2816 //CONSTRUCTION EVENTS
2817 //Build
2818 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
2819 {
2820 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2821
2822 //check base state
2823 if (construtionPart.IsBase())
2824 {
2825 SetBaseState(true);
2826
2827 //spawn kit
2829 }
2830
2831 //register constructed parts for synchronization
2832 RegisterPartForSync(construtionPart.GetId());
2833
2834 //register action that was performed on part
2835 RegisterActionForSync(construtionPart.GetId(), action_id);
2836
2837 //synchronize
2839
2840 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
2841
2842 UpdateNavmesh();
2843
2844 //update visuals
2845 UpdateVisuals();
2846
2847 //reset action sync data
2849 }
2850
2851 void OnPartBuiltClient(string part_name, int action_id)
2852 {
2853 //play sound
2854 SoundBuildStart( part_name );
2855 }
2856
2857 //Dismantle
2858 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
2859 {
2860 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
2861 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2862
2863 //register constructed parts for synchronization
2864 UnregisterPartForSync(construtionPart.GetId());
2865
2866 //register action that was performed on part
2867 RegisterActionForSync(construtionPart.GetId(), action_id);
2868
2869 //synchronize
2871
2872 // server part of sync, client will be synced from SetPartsFromSyncData
2873 SetPartFromSyncData(construtionPart);
2874
2875 UpdateNavmesh();
2876
2877 //update visuals
2878 UpdateVisuals();
2879
2880 //reset action sync data
2882
2883 //check base state
2884 if (construtionPart.IsBase())
2885 {
2886 //Destroy construction
2888 }
2889
2890 if (GetGame().IsServer())
2891 HandleItemFalling(construtionPart);
2892 }
2893
2894 void OnPartDismantledClient( string part_name, int action_id )
2895 {
2896 //play sound
2897 SoundDismantleStart( part_name );
2898 }
2899
2900 //Destroy
2901 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
2902 {
2903 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
2904 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2905
2906 //register constructed parts for synchronization
2907 UnregisterPartForSync(construtionPart.GetId());
2908
2909 //register action that was performed on part
2910 RegisterActionForSync(construtionPart.GetId(), action_id);
2911
2912 //synchronize
2914
2915 // server part of sync, client will be synced from SetPartsFromSyncData
2916 SetPartFromSyncData(construtionPart);
2917
2918 UpdateNavmesh();
2919
2920 //update visuals
2921 UpdateVisuals();
2922
2923 //reset action sync data
2925
2926 //check base state
2927 if (construtionPart.IsBase())
2928 {
2929 //Destroy construction
2931 }
2932
2933 if (GetGame().IsServer())
2934 HandleItemFalling(construtionPart);
2935 }
2936
2937 void OnPartDestroyedClient( string part_name, int action_id )
2938 {
2939 //play sound
2940 SoundDestroyStart( part_name );
2941 }
2942
2943 protected void HandleItemFalling(ConstructionPart part)
2944 {
2945 bool process = false;
2946
2947 //TODO: add a parameter to parts' config classes?
2948 process |= part.m_PartName.Contains("_roof");
2949 process |= part.m_PartName.Contains("_platform");
2950 process |= part.m_PartName.Contains("_stair");
2951
2952 if (process)
2953 {
2954 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
2955 {
2956 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
2957 return;
2958 }
2959
2960 vector mins, maxs;
2961 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
2962 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
2963
2964 //sanitize minmaxs
2965 vector minTmp, maxTmp;
2966 minTmp[0] = Math.Min(mins[0],maxs[0]);
2967 maxTmp[0] = Math.Max(mins[0],maxs[0]);
2968 minTmp[1] = Math.Min(mins[1],maxs[1]);
2969 maxTmp[1] = Math.Max(mins[1],maxs[1]);
2970 minTmp[2] = Math.Min(mins[2],maxs[2]);
2971 maxTmp[2] = Math.Max(mins[2],maxs[2]);
2972 mins = minTmp;
2973 maxs = maxTmp;
2974
2975 maxs[1] = maxs[1] + 0.35; //reach a little above..
2976
2977 ItemFall(mins,maxs);
2978 }
2979 }
2980
2981 protected void ItemFall(vector min, vector max)
2982 {
2983 array<EntityAI> foundEntities = new array<EntityAI>();
2984 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
2985
2986 //filtering
2987 ItemBase item;
2988 foreach (EntityAI entity : foundEntities)
2989 {
2990 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
2991 item.ThrowPhysically(null,vector.Zero);
2992 }
2993 }
2994
2995 // --- UPDATE
2996 void InitBaseState()
2997 {
2998 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
2999
3000 InitVisuals();
3001 UpdateNavmesh(); //regenerate navmesh
3002 GetConstruction().InitBaseState();
3003 }
3004
3005 void InitVisuals()
3006 {
3007 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
3008 //check base
3009 if ( !HasBase() )
3010 {
3011 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
3012 }
3013 else
3014 {
3015 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
3016 }
3017
3018 GetConstruction().UpdateVisuals();
3019 }
3020
3021 void UpdateVisuals()
3022 {
3023 array<string> attachmentSlots = new array<string>;
3024
3025 GetAttachmentSlots(this, attachmentSlots);
3026 foreach (string slotName : attachmentSlots)
3027 {
3029 }
3030
3031 //check base
3032 if (!HasBase())
3033 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
3034 else
3035 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
3036
3037 GetConstruction().UpdateVisuals();
3038 }
3039
3040 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
3041 {
3042 string slotNameMounted = slot_name + "_Mounted";
3043 EntityAI attachment = FindAttachmentBySlotName(slot_name);
3044
3045 if (attachment)
3046 {
3047 BarbedWire barbedWire = BarbedWire.Cast(attachment);
3048 if (barbedWire && barbedWire.IsMounted())
3049 CreateAreaDamage(slotNameMounted);
3050 else
3051 DestroyAreaDamage(slotNameMounted);
3052
3053 if (is_locked)
3054 {
3055 SetAnimationPhase(slotNameMounted, 0);
3056 SetAnimationPhase(slot_name, 1);
3057 }
3058 else
3059 {
3060 SetAnimationPhase(slotNameMounted, 1);
3061 SetAnimationPhase(slot_name, 0);
3062 }
3063 }
3064 else
3065 {
3066 SetAnimationPhase(slotNameMounted, 1);
3067 SetAnimationPhase(slot_name, 1);
3068
3069 DestroyAreaDamage(slotNameMounted);
3070 }
3071 }
3072
3073 // avoid calling this function on frequent occasions, it's a massive performance hit
3074 void UpdatePhysics()
3075 {
3077 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
3078
3079 array<string> attachmentSlots = new array<string>;
3080 GetAttachmentSlots(this, attachmentSlots);
3081
3083 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
3084
3085 foreach (string slotName : attachmentSlots)
3086 {
3088 }
3089
3090 //check base
3091 if (!HasBase())
3092 {
3094 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
3095
3096 AddProxyPhysics(ANIMATION_DEPLOYED);
3097 }
3098 else
3099 {
3101 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
3102
3103 RemoveProxyPhysics(ANIMATION_DEPLOYED);
3104 }
3105
3106 GetConstruction().UpdatePhysics();
3107 UpdateNavmesh();
3108 }
3109
3110 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
3111 {
3112 //checks for invalid appends; hotfix
3113 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
3114 return;
3115 //----------------------------------
3116 string slot_name_mounted = slot_name + "_Mounted";
3117 EntityAI attachment = FindAttachmentBySlotName( slot_name );
3118
3119 //remove proxy physics
3120 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
3121 RemoveProxyPhysics( slot_name_mounted );
3122 RemoveProxyPhysics( slot_name );
3123
3124 if ( attachment )
3125 {
3126 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
3127 if ( is_locked )
3128 {
3129 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
3130 AddProxyPhysics( slot_name_mounted );
3131 }
3132 else
3133 {
3134 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
3135 AddProxyPhysics( slot_name );
3136 }
3137 }
3138 }
3139
3140 protected void UpdateNavmesh()
3141 {
3142 SetAffectPathgraph( true, false );
3143 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
3144 }
3145
3146 override bool CanUseConstruction()
3147 {
3148 return true;
3149 }
3150
3151 override bool CanUseConstructionBuild()
3152 {
3153 return true;
3154 }
3155
3156 protected bool IsAttachmentSlotLocked( EntityAI attachment )
3157 {
3158 if ( attachment )
3159 {
3160 InventoryLocation inventory_location = new InventoryLocation;
3161 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3162
3163 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
3164 }
3165
3166 return false;
3167 }
3168
3169 protected bool IsAttachmentSlotLocked( string slot_name )
3170 {
3171 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
3172 }
3173
3174 //--- ATTACHMENT SLOTS
3175 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
3176 {
3177 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3178 if ( GetGame().ConfigIsExisting( config_path ) )
3179 {
3180 GetGame().ConfigGetTextArray( config_path, attachment_slots );
3181 }
3182 }
3183
3184 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
3185 {
3186 return true;
3187 }
3188
3189 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
3190 {
3191 return true;
3192 }
3193
3194 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
3195 {
3196 return true;
3197 }
3198
3199 // --- INIT
3200 void ConstructionInit()
3201 {
3202 if ( !m_Construction )
3203 {
3204 m_Construction = new Construction( this );
3205 }
3206
3207 GetConstruction().Init();
3208 }
3209
3211 {
3212 return m_Construction;
3213 }
3214
3215 //--- INVENTORY/ATTACHMENTS CONDITIONS
3216 //attachments
3217 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
3218 {
3219 return super.CanReceiveAttachment(attachment, slotId);
3220 }
3221
3223 {
3224 int attachment_count = GetInventory().AttachmentCount();
3225 if ( attachment_count > 0 )
3226 {
3227 if ( HasBase() && attachment_count == 1 )
3228 {
3229 return false;
3230 }
3231
3232 return true;
3233 }
3234
3235 return false;
3236 }
3237
3238 override bool ShowZonesHealth()
3239 {
3240 return true;
3241 }
3242
3243 override bool IsTakeable()
3244 {
3245 return false;
3246 }
3247
3248 //this into/outo parent.Cargo
3249 override bool CanPutInCargo( EntityAI parent )
3250 {
3251 return false;
3252 }
3253
3254 override bool CanRemoveFromCargo( EntityAI parent )
3255 {
3256 return false;
3257 }
3258
3259 //hands
3260 override bool CanPutIntoHands( EntityAI parent )
3261 {
3262 return false;
3263 }
3264
3265 //--- ACTION CONDITIONS
3266 //direction
3267 override bool IsFacingPlayer( PlayerBase player, string selection )
3268 {
3269 return true;
3270 }
3271
3272 override bool IsPlayerInside( PlayerBase player, string selection )
3273 {
3274 return true;
3275 }
3276
3279 {
3280 return false;
3281 }
3282
3283 //camera direction check
3284 bool IsFacingCamera( string selection )
3285 {
3286 return true;
3287 }
3288
3289 //roof check
3290 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
3291 {
3292 return false;
3293 }
3294
3295 //selection->player distance check
3296 bool HasProperDistance( string selection, PlayerBase player )
3297 {
3298 return true;
3299 }
3300
3301 //folding
3303 {
3304 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
3305 {
3306 return false;
3307 }
3308
3309 return true;
3310 }
3311
3313 {
3316
3317 return item;
3318 }
3319
3320 //Damage triggers (barbed wire)
3321 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
3322 {
3323 if ( GetGame() && GetGame().IsServer() )
3324 {
3325 //destroy area damage if some already exists
3326 DestroyAreaDamage( slot_name );
3327
3328 //create new area damage
3330 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
3331
3332 vector min_max[2];
3333 if ( MemoryPointExists( slot_name + "_min" ) )
3334 {
3335 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3336 }
3337 if ( MemoryPointExists( slot_name + "_max" ) )
3338 {
3339 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3340 }
3341
3342 //get proper trigger extents (min<max)
3343 vector extents[2];
3344 GetConstruction().GetTriggerExtents( min_max, extents );
3345
3346 //get box center
3347 vector center;
3348 center = GetConstruction().GetBoxCenter( min_max );
3349 center = ModelToWorld( center );
3350
3351 //rotate center if needed
3352 vector orientation = GetOrientation();;
3353 CalcDamageAreaRotation( rotation_angle, center, orientation );
3354
3355 areaDamage.SetExtents( extents[0], extents[1] );
3356 areaDamage.SetAreaPosition( center );
3357 areaDamage.SetAreaOrientation( orientation );
3358 areaDamage.SetLoopInterval( 1.0 );
3359 areaDamage.SetDeferDuration( 0.2 );
3360 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3361 areaDamage.SetAmmoName( "BarbedWireHit" );
3362 areaDamage.Spawn();
3363
3364 m_DamageTriggers.Insert( slot_name, areaDamage );
3365 }
3366 }
3367
3368 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
3369 {
3370 if ( angle_deg != 0 )
3371 {
3372 //orientation
3373 orientation[0] = orientation[0] - angle_deg;
3374
3375 //center
3376 vector rotate_axis;
3377 if ( MemoryPointExists( "rotate_axis" ) )
3378 {
3379 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3380 }
3381 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];
3382 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];
3383 center[0] = r_center_x;
3384 center[2] = r_center_z;
3385 }
3386 }
3387
3388 void DestroyAreaDamage( string slot_name )
3389 {
3390 if (GetGame() && GetGame().IsServer())
3391 {
3393 if (m_DamageTriggers.Find(slot_name, areaDamage))
3394 {
3395 if (areaDamage)
3396 {
3397 areaDamage.Destroy();
3398 }
3399
3400 m_DamageTriggers.Remove( slot_name );
3401 }
3402 }
3403 }
3404
3405 override bool IsIgnoredByConstruction()
3406 {
3407 return true;
3408 }
3409
3410 //================================================================
3411 // SOUNDS
3412 //================================================================
3413 protected void SoundBuildStart( string part_name )
3414 {
3415 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
3416 }
3417
3418 protected void SoundDismantleStart( string part_name )
3419 {
3420 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3421 }
3422
3423 protected void SoundDestroyStart( string part_name )
3424 {
3425 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3426 }
3427
3428 protected string GetBuildSoundByMaterial( string part_name )
3429 {
3430 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3431
3432 switch ( material_type )
3433 {
3434 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
3435 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
3436 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
3437 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
3438 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
3439 }
3440
3441 return "";
3442 }
3443
3444 protected string GetDismantleSoundByMaterial( string part_name )
3445 {
3446 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3447
3448 switch ( material_type )
3449 {
3450 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
3451 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
3452 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
3453 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
3454 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
3455 }
3456
3457 return "";
3458 }
3459
3460 //misc
3461 void CheckForHybridAttachments( EntityAI item, string slot_name )
3462 {
3463 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
3464 {
3465 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
3466 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
3467 {
3468 SetHealth(slot_name,"Health",item.GetHealth());
3469 }
3470 }
3471 }
3472
3473 override int GetDamageSystemVersionChange()
3474 {
3475 return 111;
3476 }
3477
3478 override void SetActions()
3479 {
3480 super.SetActions();
3481
3485 }
3486
3487 //================================================================
3488 // DEBUG
3489 //================================================================
3490 protected void DebugCustomState()
3491 {
3492 }
3493
3496 {
3497 return null;
3498 }
3499
3500 override void OnDebugSpawn()
3501 {
3502 FullyBuild();
3503 }
3504
3505 void FullyBuild()
3506 {
3508 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
3509
3510 Man p;
3511
3512 #ifdef SERVER
3513 array<Man> players = new array<Man>;
3514 GetGame().GetWorld().GetPlayerList(players);
3515 if (players.Count())
3516 p = players[0];
3517 #else
3518 p = GetGame().GetPlayer();
3519 #endif
3520
3521 foreach (ConstructionPart part : parts)
3522 {
3523 bool excluded = false;
3524 string partName = part.GetPartName();
3525 if (excludes)
3526 {
3527 foreach (string exclude : excludes)
3528 {
3529 if (partName.Contains(exclude))
3530 {
3531 excluded = true;
3532 break;
3533 }
3534 }
3535 }
3536
3537 if (!excluded)
3538 {
3539 OnPartBuiltServer(p, partName, AT_BUILD_PART);
3540 }
3541 }
3542
3543 GetConstruction().UpdateVisuals();
3544 }
3545}
3546
3547void bsbDebugPrint (string s)
3548{
3549#ifdef BSB_DEBUG
3550 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3551#else
3552 //Print("" + s); // comment/uncomment to hide/see debug logs
3553#endif
3554}
3555void bsbDebugSpam (string s)
3556{
3557#ifdef BSB_DEBUG_SPAM
3558 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3559#else
3560 //Print("" + s); // comment/uncomment to hide/see debug logs
3561#endif
3562}
const int AT_DISMANTLE_PART
Определения _constants.c:7
const int AT_DESTROY_PART
Определения _constants.c:8
const int AT_BUILD_PART
Определения _constants.c:6
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
vector GetOrientation()
Определения AreaDamageManager.c:306
void AreaDamageManager(EntityAI parent)
Определения AreaDamageManager.c:22
void OnPartDismantledClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1928
const string ANIMATION_DEPLOYED
Определения BaseBuildingBase.c:1293
override int GetHideIconMask()
Определения BaseBuildingBase.c:1378
override void OnStoreSave(ParamsWriteContext ctx)
Определения BaseBuildingBase.c:1685
void FullyBuild()
Определения BaseBuildingBase.c:2539
void UpdateVisuals()
Определения BaseBuildingBase.c:2055
void SetActionFromSyncData()
Определения BaseBuildingBase.c:1524
int m_SyncParts01
Определения BaseBuildingBase.c:1301
void UpdateNavmesh()
Определения BaseBuildingBase.c:2174
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2223
override void OnDebugSpawn()
Определения BaseBuildingBase.c:2534
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения BaseBuildingBase.c:2529
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:2457
const string SOUND_BUILD_WOOD_LOG
Определения BaseBuildingBase.c:1309
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:2447
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2074
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:2402
override bool CanObstruct()
Определения BaseBuildingBase.c:1373
bool HasAttachmentsBesidesBase()
Определения BaseBuildingBase.c:2256
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1413
const string SOUND_DISMANTLE_METAL
Определения BaseBuildingBase.c:1318
void InitBaseState()
Определения BaseBuildingBase.c:2030
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:2251
void BaseBuildingBase()
Определения BaseBuildingBase.c:1328
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:1741
void DestroyConstruction()
Определения BaseBuildingBase.c:1678
ref array< string > m_HybridAttachments
Определения BaseBuildingBase.c:1324
int m_InteractedPartId
Определения BaseBuildingBase.c:1304
bool m_HasBase
Определения BaseBuildingBase.c:1299
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2478
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:2190
void UpdatePhysics()
Определения BaseBuildingBase.c:2108
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2301
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1885
bool HasProperDistance(string selection, PlayerBase player)
Определения BaseBuildingBase.c:2330
override void OnCreatePhysics()
Определения BaseBuildingBase.c:1754
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1852
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:1511
const string SOUND_BUILD_WOOD_PLANK
Определения BaseBuildingBase.c:1310
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:1583
ref array< string > m_Mountables
Определения BaseBuildingBase.c:1325
const string SOUND_BUILD_WIRE
Определения BaseBuildingBase.c:1313
int m_SyncParts03
Определения BaseBuildingBase.c:1303
void ResetActionSyncData()
Определения BaseBuildingBase.c:1517
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:1368
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1892
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:2495
override void EEOnAfterLoad()
Определения BaseBuildingBase.c:1795
override void EEItemDetached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1827
vector GetKitSpawnPosition()
Определения BaseBuildingBase.c:1661
ref Construction m_Construction
Определения BaseBuildingBase.c:1297
bool IsFacingCamera(string selection)
Определения BaseBuildingBase.c:2318
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
Определения BaseBuildingBase.c:2218
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:2209
override bool IsDeployable()
Определения BaseBuildingBase.c:1630
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1971
override void EEInit()
Определения BaseBuildingBase.c:1805
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1442
void bsbDebugSpam(string s)
Определения BaseBuildingBase.c:1300
override void OnVariablesSynchronized()
Определения BaseBuildingBase.c:1392
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения BaseBuildingBase.c:2324
Construction GetConstruction()
Определения BaseBuildingBase.c:2244
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:2452
void DebugCustomState()
Определения BaseBuildingBase.c:2524
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:1599
string GetConstructionKitType()
Определения BaseBuildingBase.c:1666
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2228
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения BaseBuildingBase.c:1935
bool CanFoldBaseBuildingObject()
Определения BaseBuildingBase.c:2336
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:2507
const string SOUND_DISMANTLE_WOOD_PLANK
Определения BaseBuildingBase.c:1316
override void EEItemAttached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1818
const string SOUND_DISMANTLE_WOOD_LOG
Определения BaseBuildingBase.c:1315
void InitVisuals()
Определения BaseBuildingBase.c:2039
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
Определения BaseBuildingBase.c:1292
const string SOUND_BUILD_WOOD_STAIRS
Определения BaseBuildingBase.c:1311
ItemBase FoldBaseBuildingObject()
Определения BaseBuildingBase.c:2346
override bool CanPutInCargo(EntityAI parent)
Определения BaseBuildingBase.c:2283
override bool CanUseConstruction()
Определения BaseBuildingBase.c:2180
override void AfterStoreLoad()
Определения BaseBuildingBase.c:1731
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:1541
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:1761
override bool IgnoreOutOfReachCondition()
Определения BaseBuildingBase.c:1845
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BaseBuildingBase.c:1697
override bool ShowZonesHealth()
Определения BaseBuildingBase.c:2272
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2144
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2306
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2462
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:1641
const string SOUND_DISMANTLE_WIRE
Определения BaseBuildingBase.c:1319
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
Определения BaseBuildingBase.c:2312
override bool IsTakeable()
Определения BaseBuildingBase.c:2277
float m_ConstructionKitHealth
Определения BaseBuildingBase.c:1295
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:1357
override void SetActions()
Определения BaseBuildingBase.c:2512
void HandleItemFalling(ConstructionPart part)
Определения BaseBuildingBase.c:1977
void DestroyConstructionKit(ItemBase construction_kit)
Определения BaseBuildingBase.c:1671
void CreateConstructionKitInHands(notnull PlayerBase player)
Определения BaseBuildingBase.c:1652
bool IsOpened()
Определения BaseBuildingBase.c:1635
void ItemFall(vector min, vector max)
Определения BaseBuildingBase.c:2015
int m_PerformedActionId
Определения BaseBuildingBase.c:1305
override bool CanUseConstructionBuild()
Определения BaseBuildingBase.c:2185
bool HasBase()
Определения BaseBuildingBase.c:1620
void OnSynchronizedClient()
Определения BaseBuildingBase.c:1400
void SynchronizeBaseState()
Определения BaseBuildingBase.c:1384
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:2439
ref map< string, ref AreaDamageManager > m_DamageTriggers
Определения BaseBuildingBase.c:1323
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:1625
const string SOUND_BUILD_METAL
Определения BaseBuildingBase.c:1312
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
Определения BaseBuildingBase.c:1835
override bool CanPutIntoHands(EntityAI parent)
Определения BaseBuildingBase.c:2294
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:1471
override bool CanRemoveFromCargo(EntityAI parent)
Определения BaseBuildingBase.c:2288
void ConstructionInit()
Определения BaseBuildingBase.c:2234
int m_SyncParts02
Определения BaseBuildingBase.c:1302
const string SOUND_DISMANTLE_WOOD_STAIRS
Определения BaseBuildingBase.c:1317
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
PlayerSpawnPreset slotName
ConstructionMaterialType
Определения Construction.c:2
void Construction(BaseBuildingBase parent)
Определения Construction.c:26
map
Определения ControlsXboxNew.c:4
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
void DestroyAreaDamage()
Определения FireplaceBase.c:2338
void CreateAreaDamage()
Определения FireplaceBase.c:2322
EffectSound m_Sound
Определения HungerSoundHandler.c:18
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
Определения ActionTakeItem.c:7
const int HITZONE
Определения AreaDamageManager.c:4
override void SetLoopInterval(float time)
Определения AreaDamageLooped.c:32
A particular version of the deferred loop used to not damage players inside vehicles.
override void SetDeferDuration(float time)
Определения AreaDamageLoopedDeferred.c:7
proto native World GetWorld()
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void ObjectDelete(Object obj)
Super root of all classes in Enforce script.
Определения EnScript.c:11
int GetId()
Определения ConstructionPart.c:40
string GetPartName()
Определения ConstructionPart.c:30
bool IsBase()
Определения ConstructionPart.c:65
bool IsBuilt()
Определения ConstructionPart.c:45
string m_PartName
Определения ConstructionPart.c:5
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения Debug.c:122
Определения Debug.c:2
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
Определения Building.c:6
Определения constants.c:659
proto native int GetSlot()
returns slot id if current type is Attachment
InventoryLocation.
Определения InventoryLocation.c:29
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
Определения InventorySlots.c:6
override bool CanUseConstruction()
Определения BaseBuildingBase.c:891
Определения InventoryItem.c:731
static bool IsBaseBuildingLogEnable()
Определения Debug.c:698
Определения Debug.c:594
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native void GetPlayerList(out array< Man > players)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static const vector Zero
Определения EnConvert.c:110
Определения EnConvert.c:106
override string GetDebugName()
Определения dayzplayer.c:1170
Serializer ParamsReadContext
Определения gameplay.c:15
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const int STATE_RUINED
Определения constants.c:846
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto float Cos(float angle)
Returns cosinus of angle in radians.
static proto float Sin(float angle)
Returns sinus of angle in radians.
static const float DEG2RAD
Определения EnMath.c:17
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
proto int ToLower()
Changes string to lowercase. Returns length.
const int CALL_CATEGORY_GAMEPLAY
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8