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

◆ PerformRoofCheckForBase()

bool bsbDebugPrint::PerformRoofCheckForBase ( string partName,
PlayerBase player,
out bool result )
protected

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

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