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

◆ PerformRoofCheckForBase()

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

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

2366{
2367 const string ANIMATION_DEPLOYED = "Deployed";
2368
2369 float m_ConstructionKitHealth; //stored health value for used construction kit
2370
2372
2373 bool m_HasBase;
2374 //variables for synchronization of base building parts (2x31 is the current limit)
2375 int m_SyncParts01; //synchronization for already built parts (31 parts)
2376 int m_SyncParts02; //synchronization for already built parts (+31 parts)
2377 int m_SyncParts03; //synchronization for already built parts (+31 parts)
2378 int m_InteractedPartId; //construction part id that an action was performed on
2379 int m_PerformedActionId; //action id that was performed on a construction part
2380
2381 //Sounds
2382 //build
2383 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
2384 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
2385 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
2386 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
2387 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
2388 //dismantle
2389 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
2390 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
2391 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
2392 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
2393 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
2394
2395 protected EffectSound m_Sound;
2396
2400
2401 // Constructor
2402 void BaseBuildingBase()
2403 {
2405
2406 //synchronized variables
2407 RegisterNetSyncVariableInt( "m_SyncParts01" );
2408 RegisterNetSyncVariableInt( "m_SyncParts02" );
2409 RegisterNetSyncVariableInt( "m_SyncParts03" );
2410 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2411 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2412 RegisterNetSyncVariableBool( "m_HasBase" );
2413
2414 //Construction init
2416
2417 if (ConfigIsExisting("hybridAttachments"))
2418 {
2420 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
2421 }
2422 if (ConfigIsExisting("mountables"))
2423 {
2425 ConfigGetTextArray("mountables", m_Mountables);
2426 }
2427
2428 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
2429 }
2430
2431 override void EEDelete(EntityAI parent)
2432 {
2433 super.EEDelete(parent);
2434
2435 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
2436 {
2437 areaDamage.Destroy();
2438 }
2439
2440 }
2441
2442 override string GetInvulnerabilityTypeString()
2443 {
2444 return "disableBaseDamage";
2445 }
2446
2447 override bool CanObstruct()
2448 {
2449 return true;
2450 }
2451
2452 override int GetHideIconMask()
2453 {
2454 return EInventoryIconVisibility.HIDE_VICINITY;
2455 }
2456
2457 override void InitItemSounds()
2458 {
2459 super.InitItemSounds();
2460
2462 SoundParameters params = new SoundParameters();
2463 params.m_Loop = true;
2464
2465 if (GetFoldSoundset() != string.Empty)
2466 handler.AddSound(SoundConstants.ITEM_FOLD, GetFoldSoundset());
2467 if (GetLoopFoldSoundset() != string.Empty)
2468 handler.AddSound(SoundConstants.ITEM_FOLD_LOOP, GetLoopFoldSoundset(), params);
2469 }
2470
2471 override string GetFoldSoundset()
2472 {
2473 return "putDown_FenceKit_SoundSet";
2474 }
2475
2476 override string GetLoopFoldSoundset()
2477 {
2478 return "Shelter_Site_Build_Loop_SoundSet";
2479 }
2480
2481 // --- SYNCHRONIZATION
2483 {
2484 if ( GetGame().IsServer() )
2485 {
2486 SetSynchDirty();
2487 }
2488 }
2489
2490 override void OnVariablesSynchronized()
2491 {
2492 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
2493 super.OnVariablesSynchronized();
2494
2496 }
2497
2498 protected void OnSynchronizedClient()
2499 {
2500 //update parts
2502
2503 //update action on part
2505
2506 //update visuals (client)
2507 UpdateVisuals();
2508 }
2509
2510 //parts synchronization
2511 void RegisterPartForSync( int part_id )
2512 {
2513 //part_id must starts from index = 1
2514 int offset;
2515 int mask;
2516
2517 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2518 {
2519 offset = part_id - 1;
2520 mask = 1 << offset;
2521
2522 m_SyncParts01 = m_SyncParts01 | mask;
2523 }
2524 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2525 {
2526 offset = ( part_id % 32 );
2527 mask = 1 << offset;
2528
2529 m_SyncParts02 = m_SyncParts02 | mask;
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 m_SyncParts03 = m_SyncParts03 | mask;
2537 }
2538 }
2539
2540 void UnregisterPartForSync( int part_id )
2541 {
2542 //part_id must starts from index = 1
2543 int offset;
2544 int mask;
2545
2546 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2547 {
2548 offset = part_id - 1;
2549 mask = 1 << offset;
2550
2551 m_SyncParts01 = m_SyncParts01 & ~mask;
2552 }
2553 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2554 {
2555 offset = ( part_id % 32 );
2556 mask = 1 << offset;
2557
2558 m_SyncParts02 = m_SyncParts02 & ~mask;
2559 }
2560 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2561 {
2562 offset = ( part_id % 63 );
2563 mask = 1 << offset;
2564
2565 m_SyncParts03 = m_SyncParts03 & ~mask;
2566 }
2567 }
2568
2569 bool IsPartBuildInSyncData( int part_id )
2570 {
2571 //part_id must starts from index = 1
2572 int offset;
2573 int mask;
2574
2575 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2576 {
2577 offset = part_id - 1;
2578 mask = 1 << offset;
2579
2580 if ( ( m_SyncParts01 & mask ) > 0 )
2581 {
2582 return true;
2583 }
2584 }
2585 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2586 {
2587 offset = ( part_id % 32 );
2588 mask = 1 << offset;
2589
2590 if ( ( m_SyncParts02 & mask ) > 0 )
2591 {
2592 return true;
2593 }
2594 }
2595 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2596 {
2597 offset = ( part_id % 63 );
2598 mask = 1 << offset;
2599
2600 if ( ( m_SyncParts03 & mask ) > 0 )
2601 {
2602 return true;
2603 }
2604 }
2605
2606 return false;
2607 }
2608
2609 protected void RegisterActionForSync( int part_id, int action_id )
2610 {
2611 m_InteractedPartId = part_id;
2612 m_PerformedActionId = action_id;
2613 }
2614
2615 protected void ResetActionSyncData()
2616 {
2617 //reset data
2618 m_InteractedPartId = -1;
2620 }
2621
2622 protected void SetActionFromSyncData()
2623 {
2624 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
2625 {
2627 int build_action_id = m_PerformedActionId;
2628
2629 switch( build_action_id )
2630 {
2631 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
2632 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
2633 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
2634 }
2635 }
2636 }
2637 //------
2638
2640 {
2641 string key = part.m_PartName;
2642 bool is_base = part.IsBase();
2643 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
2644 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
2645 if ( is_part_built_sync )
2646 {
2647 if ( !part.IsBuilt() )
2648 {
2649 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
2650 GetConstruction().AddToConstructedParts( key );
2651 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
2652
2653 if (is_base)
2654 {
2656 RemoveProxyPhysics( ANIMATION_DEPLOYED );
2657 }
2658 }
2659 }
2660 else
2661 {
2662 if ( part.IsBuilt() )
2663 {
2664 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
2665 GetConstruction().RemoveFromConstructedParts( key );
2666 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
2667
2668 if (is_base)
2669 {
2671 AddProxyPhysics( ANIMATION_DEPLOYED );
2672 }
2673 }
2674 }
2675
2676 //check slot lock for material attachments
2677 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
2678 }
2679
2680 //set construction parts based on synchronized data
2682 {
2683 Construction construction = GetConstruction();
2684 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2685
2686 for ( int i = 0; i < construction_parts.Count(); ++i )
2687 {
2688 string key = construction_parts.GetKey( i );
2689 ConstructionPart value = construction_parts.Get( key );
2690 SetPartFromSyncData(value);
2691 }
2692
2693 //regenerate navmesh
2694 UpdateNavmesh();
2695 }
2696
2697 protected ConstructionPart GetConstructionPartById( int id )
2698 {
2699 Construction construction = GetConstruction();
2700 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2701
2702 for ( int i = 0; i < construction_parts.Count(); ++i )
2703 {
2704 string key = construction_parts.GetKey( i );
2705 ConstructionPart value = construction_parts.Get( key );
2706
2707 if ( value.GetId() == id )
2708 {
2709 return value;
2710 }
2711 }
2712
2713 return NULL;
2714 }
2715 //
2716
2717 //Base
2718 bool HasBase()
2719 {
2720 return m_HasBase;
2721 }
2722
2723 void SetBaseState( bool has_base )
2724 {
2725 m_HasBase = has_base;
2726 }
2727
2728 override bool IsDeployable()
2729 {
2730 return true;
2731 }
2732
2733 bool IsOpened()
2734 {
2735 return false;
2736 }
2737
2738 //--- CONSTRUCTION KIT
2740 {
2741 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
2742 if ( m_ConstructionKitHealth > 0 )
2743 {
2744 construction_kit.SetHealth( m_ConstructionKitHealth );
2745 }
2746
2747 return construction_kit;
2748 }
2749
2750 void CreateConstructionKitInHands(notnull PlayerBase player)
2751 {
2752 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2753 if ( m_ConstructionKitHealth > 0 )
2754 {
2755 construction_kit.SetHealth( m_ConstructionKitHealth );
2756 }
2757 }
2758
2759 protected vector GetKitSpawnPosition()
2760 {
2761 return GetPosition();
2762 }
2763
2764 protected string GetConstructionKitType()
2765 {
2766 return "";
2767 }
2768
2769 void DestroyConstructionKit( ItemBase construction_kit )
2770 {
2771 m_ConstructionKitHealth = construction_kit.GetHealth();
2772 GetGame().ObjectDelete( construction_kit );
2773 }
2774
2775 //--- CONSTRUCTION
2776 void DestroyConstruction()
2777 {
2778 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2779 GetGame().ObjectDelete( this );
2780 }
2781
2782 // --- EVENTS
2783 override void OnStoreSave( ParamsWriteContext ctx )
2784 {
2785 super.OnStoreSave( ctx );
2786
2787 //sync parts 01
2788 ctx.Write( m_SyncParts01 );
2789 ctx.Write( m_SyncParts02 );
2790 ctx.Write( m_SyncParts03 );
2791
2792 ctx.Write( m_HasBase );
2793 }
2794
2795 override bool OnStoreLoad( ParamsReadContext ctx, int version )
2796 {
2797 if ( !super.OnStoreLoad( ctx, version ) )
2798 return false;
2799
2800 //--- Base building data ---
2801 //Restore synced parts data
2802 if ( !ctx.Read( m_SyncParts01 ) )
2803 {
2804 m_SyncParts01 = 0; //set default
2805 return false;
2806 }
2807 if ( !ctx.Read( m_SyncParts02 ) )
2808 {
2809 m_SyncParts02 = 0; //set default
2810 return false;
2811 }
2812 if ( !ctx.Read( m_SyncParts03 ) )
2813 {
2814 m_SyncParts03 = 0; //set default
2815 return false;
2816 }
2817
2818 //has base
2819 if ( !ctx.Read( m_HasBase ) )
2820 {
2821 m_HasBase = false;
2822 return false;
2823 }
2824 //---
2825
2826 return true;
2827 }
2828
2829 override void AfterStoreLoad()
2830 {
2831 super.AfterStoreLoad();
2832
2834 {
2836 }
2837 }
2838
2840 {
2841 //update server data
2843
2844 //set base state
2845 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
2846 SetBaseState( construction_part.IsBuilt() ) ;
2847
2848 //synchronize after load
2850 }
2851
2852 override void OnCreatePhysics()
2853 {
2854 super.OnCreatePhysics();
2857 }
2858
2859 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2860 {
2862 return;
2863
2864 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2865
2866 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
2867 return;
2868
2869 Construction construction = GetConstruction();
2870 string part_name = zone;
2871 part_name.ToLower();
2872
2873 if ( newLevel == GameConstants.STATE_RUINED )
2874 {
2875 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2876
2877 if ( construction_part && construction.IsPartConstructed( part_name ) )
2878 {
2879 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
2880 construction.DestroyConnectedParts(part_name);
2881 }
2882
2883 //barbed wire handling (hack-ish)
2884 if ( part_name.Contains("barbed") )
2885 {
2886 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2887 if (barbed_wire)
2888 barbed_wire.SetMountedState( false );
2889 }
2890 }
2891 }
2892
2893 override void EEOnAfterLoad()
2894 {
2896 {
2898 }
2899
2900 super.EEOnAfterLoad();
2901 }
2902
2903 override void EEInit()
2904 {
2905 super.EEInit();
2906
2907 // init visuals and physics
2908 InitBaseState();
2909
2910 //debug
2911 #ifdef DEVELOPER
2913 #endif
2914 }
2915
2916 override void EEItemAttached( EntityAI item, string slot_name )
2917 {
2918 super.EEItemAttached( item, slot_name );
2919
2920 CheckForHybridAttachments( item, slot_name );
2921 UpdateVisuals();
2922 UpdateAttachmentPhysics( slot_name, false );
2923 }
2924
2925 override void EEItemDetached( EntityAI item, string slot_name )
2926 {
2927 super.EEItemDetached( item, slot_name );
2928
2929 UpdateVisuals();
2930 UpdateAttachmentPhysics( slot_name, false );
2931 }
2932
2933 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
2934 {
2935 string slot_name = InventorySlots.GetSlotName( slotId );
2936 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
2937
2938 UpdateAttachmentVisuals( slot_name, locked );
2939 UpdateAttachmentPhysics( slot_name, locked );
2940 }
2941
2942 //ignore out of reach condition
2943 override bool IgnoreOutOfReachCondition()
2944 {
2945 return true;
2946 }
2947
2948 //CONSTRUCTION EVENTS
2949 //Build
2950 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
2951 {
2952 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2953
2954 //check base state
2955 if (construtionPart.IsBase())
2956 {
2957 SetBaseState(true);
2958
2959 //spawn kit
2961 }
2962
2963 //register constructed parts for synchronization
2964 RegisterPartForSync(construtionPart.GetId());
2965
2966 //register action that was performed on part
2967 RegisterActionForSync(construtionPart.GetId(), action_id);
2968
2969 //synchronize
2971
2972 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
2973
2974 UpdateNavmesh();
2975
2976 //update visuals
2977 UpdateVisuals();
2978
2979 //reset action sync data
2981 }
2982
2983 void OnPartBuiltClient(string part_name, int action_id)
2984 {
2985 //play sound
2986 SoundBuildStart( part_name );
2987 }
2988
2989 //Dismantle
2990 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
2991 {
2992 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
2993 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2994
2995 //register constructed parts for synchronization
2996 UnregisterPartForSync(construtionPart.GetId());
2997
2998 //register action that was performed on part
2999 RegisterActionForSync(construtionPart.GetId(), action_id);
3000
3001 //synchronize
3003
3004 // server part of sync, client will be synced from SetPartsFromSyncData
3005 SetPartFromSyncData(construtionPart);
3006
3007 UpdateNavmesh();
3008
3009 //update visuals
3010 UpdateVisuals();
3011
3012 //reset action sync data
3014
3015 //check base state
3016 if (construtionPart.IsBase())
3017 {
3018 //Destroy construction
3020 }
3021 }
3022
3023 void OnPartDismantledClient( string part_name, int action_id )
3024 {
3025 //play sound
3026 SoundDismantleStart( part_name );
3027 }
3028
3029 //Destroy
3030 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
3031 {
3032 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
3033 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
3034
3035 //register constructed parts for synchronization
3036 UnregisterPartForSync(construtionPart.GetId());
3037
3038 //register action that was performed on part
3039 RegisterActionForSync(construtionPart.GetId(), action_id);
3040
3041 //synchronize
3043
3044 // server part of sync, client will be synced from SetPartsFromSyncData
3045 SetPartFromSyncData(construtionPart);
3046
3047 UpdateNavmesh();
3048
3049 //update visuals
3050 UpdateVisuals();
3051
3052 //reset action sync data
3054
3055 //check base state
3056 if (construtionPart.IsBase())
3057 {
3058 //Destroy construction
3060 }
3061 }
3062
3063 void OnPartDestroyedClient( string part_name, int action_id )
3064 {
3065 //play sound
3066 SoundDestroyStart( part_name );
3067 }
3068
3070 protected void HandleItemFalling(ConstructionPart part)
3071 {
3072 bool process = false;
3073
3074 //TODO: add a parameter to parts' config classes?
3075 process |= part.m_PartName.Contains("_roof");
3076 process |= part.m_PartName.Contains("_platform");
3077 process |= part.m_PartName.Contains("_stair");
3078
3079 if (process)
3080 {
3081 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
3082 {
3083 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
3084 return;
3085 }
3086
3087 vector mins, maxs;
3088 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
3089 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
3090
3091 //sanitize minmaxs
3092 vector minTmp, maxTmp;
3093 minTmp[0] = Math.Min(mins[0],maxs[0]);
3094 maxTmp[0] = Math.Max(mins[0],maxs[0]);
3095 minTmp[1] = Math.Min(mins[1],maxs[1]);
3096 maxTmp[1] = Math.Max(mins[1],maxs[1]);
3097 minTmp[2] = Math.Min(mins[2],maxs[2]);
3098 maxTmp[2] = Math.Max(mins[2],maxs[2]);
3099 mins = minTmp;
3100 maxs = maxTmp;
3101
3102 maxs[1] = maxs[1] + 0.35; //reach a little above..
3103
3104 ItemFall(mins,maxs);
3105 }
3106 }
3107
3109 protected void ItemFall(vector min, vector max)
3110 {
3111 array<EntityAI> foundEntities = new array<EntityAI>();
3112 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
3113
3114 //filtering
3115 ItemBase item;
3116 foreach (EntityAI entity : foundEntities)
3117 {
3118 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
3119 item.ThrowPhysically(null,vector.Zero);
3120 }
3121 }
3122
3123 // --- UPDATE
3124 void InitBaseState()
3125 {
3126 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
3127
3128 InitVisuals();
3129 UpdateNavmesh(); //regenerate navmesh
3130 GetConstruction().InitBaseState();
3131 }
3132
3133 void InitVisuals()
3134 {
3135 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
3136 //check base
3137 if ( !HasBase() )
3138 {
3139 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
3140 }
3141 else
3142 {
3143 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
3144 }
3145
3146 GetConstruction().UpdateVisuals();
3147 }
3148
3149 void UpdateVisuals()
3150 {
3151 array<string> attachmentSlots = new array<string>;
3152
3153 GetAttachmentSlots(this, attachmentSlots);
3154 foreach (string slotName : attachmentSlots)
3155 {
3157 }
3158
3159 //check base
3160 if (!HasBase())
3161 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
3162 else
3163 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
3164
3165 GetConstruction().UpdateVisuals();
3166 }
3167
3168 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
3169 {
3170 string slotNameMounted = slot_name + "_Mounted";
3171 EntityAI attachment = FindAttachmentBySlotName(slot_name);
3172
3173 if (attachment)
3174 {
3175 BarbedWire barbedWire = BarbedWire.Cast(attachment);
3176 if (barbedWire && barbedWire.IsMounted())
3177 CreateAreaDamage(slotNameMounted);
3178 else
3179 DestroyAreaDamage(slotNameMounted);
3180
3181 if (is_locked)
3182 {
3183 SetAnimationPhase(slotNameMounted, 0);
3184 SetAnimationPhase(slot_name, 1);
3185 }
3186 else
3187 {
3188 SetAnimationPhase(slotNameMounted, 1);
3189 SetAnimationPhase(slot_name, 0);
3190 }
3191 }
3192 else
3193 {
3194 SetAnimationPhase(slotNameMounted, 1);
3195 SetAnimationPhase(slot_name, 1);
3196
3197 DestroyAreaDamage(slotNameMounted);
3198 }
3199 }
3200
3201 // avoid calling this function on frequent occasions, it's a massive performance hit
3202 void UpdatePhysics()
3203 {
3205 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
3206
3207 array<string> attachmentSlots = new array<string>;
3208 GetAttachmentSlots(this, attachmentSlots);
3209
3211 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
3212
3213 foreach (string slotName : attachmentSlots)
3214 {
3216 }
3217
3218 //check base
3219 if (!HasBase())
3220 {
3222 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
3223
3224 AddProxyPhysics(ANIMATION_DEPLOYED);
3225 }
3226 else
3227 {
3229 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
3230
3231 RemoveProxyPhysics(ANIMATION_DEPLOYED);
3232 }
3233
3234 GetConstruction().UpdatePhysics();
3235 UpdateNavmesh();
3236 }
3237
3238 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
3239 {
3240 //checks for invalid appends; hotfix
3241 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
3242 return;
3243 //----------------------------------
3244 string slot_name_mounted = slot_name + "_Mounted";
3245 EntityAI attachment = FindAttachmentBySlotName( slot_name );
3246
3247 //remove proxy physics
3248 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
3249 RemoveProxyPhysics( slot_name_mounted );
3250 RemoveProxyPhysics( slot_name );
3251
3252 if ( attachment )
3253 {
3254 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
3255 if ( is_locked )
3256 {
3257 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
3258 AddProxyPhysics( slot_name_mounted );
3259 }
3260 else
3261 {
3262 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
3263 AddProxyPhysics( slot_name );
3264 }
3265 }
3266 }
3267
3268 protected void UpdateNavmesh()
3269 {
3270 SetAffectPathgraph( true, false );
3271 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
3272 }
3273
3274 override bool CanUseConstruction()
3275 {
3276 return true;
3277 }
3278
3279 override bool CanUseConstructionBuild()
3280 {
3281 return true;
3282 }
3283
3284 protected bool IsAttachmentSlotLocked( EntityAI attachment )
3285 {
3286 if ( attachment )
3287 {
3288 InventoryLocation inventory_location = new InventoryLocation;
3289 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3290
3291 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
3292 }
3293
3294 return false;
3295 }
3296
3297 protected bool IsAttachmentSlotLocked( string slot_name )
3298 {
3299 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
3300 }
3301
3302 //--- ATTACHMENT SLOTS
3303 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
3304 {
3305 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3306 if ( GetGame().ConfigIsExisting( config_path ) )
3307 {
3308 GetGame().ConfigGetTextArray( config_path, attachment_slots );
3309 }
3310 }
3311
3312 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
3313 {
3314 return true;
3315 }
3316
3317 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
3318 {
3319 return true;
3320 }
3321
3322 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
3323 {
3324 return true;
3325 }
3326
3327 // --- INIT
3328 void ConstructionInit()
3329 {
3330 if ( !m_Construction )
3331 {
3332 m_Construction = new Construction( this );
3333 }
3334
3335 GetConstruction().Init();
3336 }
3337
3339 {
3340 return m_Construction;
3341 }
3342
3343 //--- INVENTORY/ATTACHMENTS CONDITIONS
3344 //attachments
3345 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
3346 {
3347 return super.CanReceiveAttachment(attachment, slotId);
3348 }
3349
3351 {
3352 int attachment_count = GetInventory().AttachmentCount();
3353 if ( attachment_count > 0 )
3354 {
3355 if ( HasBase() && attachment_count == 1 )
3356 {
3357 return false;
3358 }
3359
3360 return true;
3361 }
3362
3363 return false;
3364 }
3365
3366 override bool ShowZonesHealth()
3367 {
3368 return true;
3369 }
3370
3371 override bool IsTakeable()
3372 {
3373 return false;
3374 }
3375
3376 //this into/outo parent.Cargo
3377 override bool CanPutInCargo( EntityAI parent )
3378 {
3379 return false;
3380 }
3381
3382 override bool CanRemoveFromCargo( EntityAI parent )
3383 {
3384 return false;
3385 }
3386
3387 //hands
3388 override bool CanPutIntoHands( EntityAI parent )
3389 {
3390 return false;
3391 }
3392
3393 //--- ACTION CONDITIONS
3394 //direction
3395 override bool IsFacingPlayer( PlayerBase player, string selection )
3396 {
3397 return true;
3398 }
3399
3400 override bool IsPlayerInside( PlayerBase player, string selection )
3401 {
3402 return true;
3403 }
3404
3407 {
3408 return false;
3409 }
3410
3411 //camera direction check
3412 bool IsFacingCamera( string selection )
3413 {
3414 return true;
3415 }
3416
3417 //roof check
3418 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
3419 {
3420 return false;
3421 }
3422
3423 //selection->player distance check
3424 bool HasProperDistance( string selection, PlayerBase player )
3425 {
3426 return true;
3427 }
3428
3429 //folding
3431 {
3432 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
3433 {
3434 return false;
3435 }
3436
3437 return true;
3438 }
3439
3441 {
3444
3445 return item;
3446 }
3447
3448 //Damage triggers (barbed wire)
3449 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
3450 {
3451 if ( GetGame() && GetGame().IsServer() )
3452 {
3453 //destroy area damage if some already exists
3454 DestroyAreaDamage( slot_name );
3455
3456 //create new area damage
3458 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
3459
3460 vector min_max[2];
3461 if ( MemoryPointExists( slot_name + "_min" ) )
3462 {
3463 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3464 }
3465 if ( MemoryPointExists( slot_name + "_max" ) )
3466 {
3467 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3468 }
3469
3470 //get proper trigger extents (min<max)
3471 vector extents[2];
3472 GetConstruction().GetTriggerExtents( min_max, extents );
3473
3474 //get box center
3475 vector center;
3476 center = GetConstruction().GetBoxCenter( min_max );
3477 center = ModelToWorld( center );
3478
3479 //rotate center if needed
3480 vector orientation = GetOrientation();;
3481 CalcDamageAreaRotation( rotation_angle, center, orientation );
3482
3483 areaDamage.SetExtents( extents[0], extents[1] );
3484 areaDamage.SetAreaPosition( center );
3485 areaDamage.SetAreaOrientation( orientation );
3486 areaDamage.SetLoopInterval( 1.0 );
3487 areaDamage.SetDeferDuration( 0.2 );
3488 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3489 areaDamage.SetAmmoName( "BarbedWireHit" );
3490 areaDamage.Spawn();
3491
3492 m_DamageTriggers.Insert( slot_name, areaDamage );
3493 }
3494 }
3495
3496 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
3497 {
3498 if ( angle_deg != 0 )
3499 {
3500 //orientation
3501 orientation[0] = orientation[0] - angle_deg;
3502
3503 //center
3504 vector rotate_axis;
3505 if ( MemoryPointExists( "rotate_axis" ) )
3506 {
3507 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3508 }
3509 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];
3510 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];
3511 center[0] = r_center_x;
3512 center[2] = r_center_z;
3513 }
3514 }
3515
3516 void DestroyAreaDamage( string slot_name )
3517 {
3518 if (GetGame() && GetGame().IsServer())
3519 {
3521 if (m_DamageTriggers.Find(slot_name, areaDamage))
3522 {
3523 if (areaDamage)
3524 {
3525 areaDamage.Destroy();
3526 }
3527
3528 m_DamageTriggers.Remove( slot_name );
3529 }
3530 }
3531 }
3532
3533 override bool IsIgnoredByConstruction()
3534 {
3535 return true;
3536 }
3537
3538 //================================================================
3539 // SOUNDS
3540 //================================================================
3541 protected void SoundBuildStart( string part_name )
3542 {
3543 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
3544 }
3545
3546 protected void SoundDismantleStart( string part_name )
3547 {
3548 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3549 }
3550
3551 protected void SoundDestroyStart( string part_name )
3552 {
3553 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3554 }
3555
3556 protected string GetBuildSoundByMaterial( string part_name )
3557 {
3558 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3559
3560 switch ( material_type )
3561 {
3562 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
3563 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
3564 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
3565 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
3566 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
3567 }
3568
3569 return "";
3570 }
3571
3572 protected string GetDismantleSoundByMaterial( string part_name )
3573 {
3574 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3575
3576 switch ( material_type )
3577 {
3578 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
3579 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
3580 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
3581 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
3582 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
3583 }
3584
3585 return "";
3586 }
3587
3588 //misc
3589 void CheckForHybridAttachments( EntityAI item, string slot_name )
3590 {
3591 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
3592 {
3593 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
3594 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
3595 {
3596 SetHealth(slot_name,"Health",item.GetHealth());
3597 }
3598 }
3599 }
3600
3601 override int GetDamageSystemVersionChange()
3602 {
3603 return 111;
3604 }
3605
3606 override void SetActions()
3607 {
3608 super.SetActions();
3609
3613 }
3614
3615 //================================================================
3616 // DEBUG
3617 //================================================================
3618 protected void DebugCustomState()
3619 {
3620 }
3621
3624 {
3625 return null;
3626 }
3627
3628 override void OnDebugSpawn()
3629 {
3630 FullyBuild();
3631 }
3632
3633 void FullyBuild()
3634 {
3636 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
3637
3638 Man p;
3639
3640 #ifdef SERVER
3641 array<Man> players = new array<Man>;
3642 GetGame().GetWorld().GetPlayerList(players);
3643 if (players.Count())
3644 p = players[0];
3645 #else
3646 p = GetGame().GetPlayer();
3647 #endif
3648
3649 foreach (ConstructionPart part : parts)
3650 {
3651 bool excluded = false;
3652 string partName = part.GetPartName();
3653 if (excludes)
3654 {
3655 foreach (string exclude : excludes)
3656 {
3657 if (partName.Contains(exclude))
3658 {
3659 excluded = true;
3660 break;
3661 }
3662 }
3663 }
3664
3665 if (!excluded)
3666 {
3667 OnPartBuiltServer(p, partName, AT_BUILD_PART);
3668 }
3669 }
3670
3671 GetConstruction().UpdateVisuals();
3672 }
3673}
3674
3675void bsbDebugPrint (string s)
3676{
3677#ifdef BSB_DEBUG
3678 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3679#else
3680 //Print("" + s); // comment/uncomment to hide/see debug logs
3681#endif
3682}
3683void bsbDebugSpam (string s)
3684{
3685#ifdef BSB_DEBUG_SPAM
3686 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3687#else
3688 //Print("" + s); // comment/uncomment to hide/see debug logs
3689#endif
3690}
const int AT_DISMANTLE_PART
const int AT_DESTROY_PART
const int AT_BUILD_PART
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
vector GetOrientation()
Определения AreaDamageManager.c:306
void AreaDamageManager(EntityAI parent)
Определения AreaDamageManager.c:22
void OnPartDismantledClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1969
const string ANIMATION_DEPLOYED
Определения BaseBuildingBase.c:1313
override int GetHideIconMask()
Определения BaseBuildingBase.c:1398
override void OnStoreSave(ParamsWriteContext ctx)
Определения BaseBuildingBase.c:1729
void FullyBuild()
Определения BaseBuildingBase.c:2579
void UpdateVisuals()
Определения BaseBuildingBase.c:2095
void SetActionFromSyncData()
Определения BaseBuildingBase.c:1568
int m_SyncParts01
Определения BaseBuildingBase.c:1321
void UpdateNavmesh()
Определения BaseBuildingBase.c:2214
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2263
override void OnDebugSpawn()
Определения BaseBuildingBase.c:2574
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения BaseBuildingBase.c:2569
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:2497
const string SOUND_BUILD_WOOD_LOG
Определения BaseBuildingBase.c:1329
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:2487
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2114
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:2442
override bool CanObstruct()
Определения BaseBuildingBase.c:1393
bool HasAttachmentsBesidesBase()
Определения BaseBuildingBase.c:2296
override void InitItemSounds()
Определения BaseBuildingBase.c:1403
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1457
const string SOUND_DISMANTLE_METAL
Определения BaseBuildingBase.c:1338
void InitBaseState()
Определения BaseBuildingBase.c:2070
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:2291
void BaseBuildingBase()
Определения BaseBuildingBase.c:1348
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:1785
void DestroyConstruction()
Определения BaseBuildingBase.c:1722
ref array< string > m_HybridAttachments
Определения BaseBuildingBase.c:1344
int m_InteractedPartId
Определения BaseBuildingBase.c:1324
override string GetFoldSoundset()
Определения BaseBuildingBase.c:1417
bool m_HasBase
Определения BaseBuildingBase.c:1319
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2518
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:2230
void UpdatePhysics()
Определения BaseBuildingBase.c:2148
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2341
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1929
bool HasProperDistance(string selection, PlayerBase player)
Определения BaseBuildingBase.c:2370
override void OnCreatePhysics()
Определения BaseBuildingBase.c:1798
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1896
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:1555
const string SOUND_BUILD_WOOD_PLANK
Определения BaseBuildingBase.c:1330
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:1627
ref array< string > m_Mountables
Определения BaseBuildingBase.c:1345
const string SOUND_BUILD_WIRE
Определения BaseBuildingBase.c:1333
int m_SyncParts03
Определения BaseBuildingBase.c:1323
void ResetActionSyncData()
Определения BaseBuildingBase.c:1561
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:1388
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1936
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:2535
override void EEOnAfterLoad()
Определения BaseBuildingBase.c:1839
override void EEItemDetached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1871
vector GetKitSpawnPosition()
Определения BaseBuildingBase.c:1705
ref Construction m_Construction
Определения BaseBuildingBase.c:1317
bool IsFacingCamera(string selection)
Определения BaseBuildingBase.c:2358
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
Определения BaseBuildingBase.c:2258
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:2249
override bool IsDeployable()
Определения BaseBuildingBase.c:1674
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:2009
override void EEInit()
Определения BaseBuildingBase.c:1849
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1486
void bsbDebugSpam(string s)
Определения BaseBuildingBase.c:1320
override void OnVariablesSynchronized()
Определения BaseBuildingBase.c:1436
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения BaseBuildingBase.c:2364
Construction GetConstruction()
Определения BaseBuildingBase.c:2284
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:2492
void DebugCustomState()
Определения BaseBuildingBase.c:2564
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:1643
string GetConstructionKitType()
Определения BaseBuildingBase.c:1710
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2268
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения BaseBuildingBase.c:1976
bool CanFoldBaseBuildingObject()
Определения BaseBuildingBase.c:2376
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:2547
const string SOUND_DISMANTLE_WOOD_PLANK
Определения BaseBuildingBase.c:1336
override void EEItemAttached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1862
const string SOUND_DISMANTLE_WOOD_LOG
Определения BaseBuildingBase.c:1335
void InitVisuals()
Определения BaseBuildingBase.c:2079
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
Определения BaseBuildingBase.c:1312
const string SOUND_BUILD_WOOD_STAIRS
Определения BaseBuildingBase.c:1331
ItemBase FoldBaseBuildingObject()
Определения BaseBuildingBase.c:2386
override bool CanPutInCargo(EntityAI parent)
Определения BaseBuildingBase.c:2323
override bool CanUseConstruction()
Определения BaseBuildingBase.c:2220
override void AfterStoreLoad()
Определения BaseBuildingBase.c:1775
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:1585
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:1805
override bool IgnoreOutOfReachCondition()
Определения BaseBuildingBase.c:1889
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BaseBuildingBase.c:1741
override bool ShowZonesHealth()
Определения BaseBuildingBase.c:2312
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2184
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2346
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2502
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:1685
const string SOUND_DISMANTLE_WIRE
Определения BaseBuildingBase.c:1339
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
Определения BaseBuildingBase.c:2352
override bool IsTakeable()
Определения BaseBuildingBase.c:2317
float m_ConstructionKitHealth
Определения BaseBuildingBase.c:1315
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:1377
override void SetActions()
Определения BaseBuildingBase.c:2552
void HandleItemFalling(ConstructionPart part)
Disconnected temporarily.
Определения BaseBuildingBase.c:2016
void DestroyConstructionKit(ItemBase construction_kit)
Определения BaseBuildingBase.c:1715
void CreateConstructionKitInHands(notnull PlayerBase player)
Определения BaseBuildingBase.c:1696
bool IsOpened()
Определения BaseBuildingBase.c:1679
void ItemFall(vector min, vector max)
Disconnected temporarily.
Определения BaseBuildingBase.c:2055
int m_PerformedActionId
Определения BaseBuildingBase.c:1325
override bool CanUseConstructionBuild()
Определения BaseBuildingBase.c:2225
bool HasBase()
Определения BaseBuildingBase.c:1664
void OnSynchronizedClient()
Определения BaseBuildingBase.c:1444
void SynchronizeBaseState()
Определения BaseBuildingBase.c:1428
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:2479
ref map< string, ref AreaDamageManager > m_DamageTriggers
Определения BaseBuildingBase.c:1343
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:1669
const string SOUND_BUILD_METAL
Определения BaseBuildingBase.c:1332
override string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:1422
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
Определения BaseBuildingBase.c:1879
override bool CanPutIntoHands(EntityAI parent)
Определения BaseBuildingBase.c:2334
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:1515
override bool CanRemoveFromCargo(EntityAI parent)
Определения BaseBuildingBase.c:2328
void ConstructionInit()
Определения BaseBuildingBase.c:2274
int m_SyncParts02
Определения BaseBuildingBase.c:1322
const string SOUND_DISMANTLE_WOOD_STAIRS
Определения BaseBuildingBase.c:1337
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
PlayerSpawnPreset slotName
ConstructionMaterialType
Определения Construction.c:2
void Construction(BaseBuildingBase parent)
Определения Construction.c:26
map
Определения ControlsXboxNew.c:4
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
void DestroyAreaDamage()
Определения FireplaceBase.c:2345
void CreateAreaDamage()
Определения FireplaceBase.c:2329
Empty
Определения Hand_States.c:14
EffectSound m_Sound
Определения HungerSoundHandler.c:18
string GetFoldSoundset()
Определения BaseBuildingBase.c:1417
string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:1422
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9229
bool m_FixDamageSystemInit
Определения ItemBase.c:4907
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
Определения ActionTakeItem.c:7
const int HITZONE
Определения AreaDamageManager.c:4
override void SetLoopInterval(float time)
Определения AreaDamageLooped.c:32
A particular version of the deferred loop used to not damage players inside vehicles.
override void SetDeferDuration(float time)
Определения AreaDamageLoopedDeferred.c:7
proto native World GetWorld()
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void ObjectDelete(Object obj)
Super root of all classes in Enforce script.
Определения EnScript.c:11
int GetId()
Определения ConstructionPart.c:40
string GetPartName()
Определения ConstructionPart.c:30
bool IsBase()
Определения ConstructionPart.c:65
bool IsBuilt()
Определения ConstructionPart.c:45
string m_PartName
Определения ConstructionPart.c:5
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения 3_Game/tools/Debug.c:122
Определения 3_Game/tools/Debug.c:2
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
proto native int GetSlot()
returns slot id if current type is Attachment
InventoryLocation.
Определения InventoryLocation.c:29
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
Определения InventorySlots.c:6
override bool CanUseConstruction()
Определения BaseBuildingBase.c:911
static bool IsBaseBuildingLogEnable()
Определения 3_Game/tools/Debug.c:698
Определения 3_Game/tools/Debug.c:594
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
proto native void GetPlayerList(out array< Man > players)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static const vector Zero
Определения EnConvert.c:110
Определения EnConvert.c:106
override string GetDebugName()
Определения dayzplayer.c:1170
Serializer ParamsReadContext
Определения gameplay.c:15
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const int STATE_RUINED
Определения 3_Game/constants.c:848
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto float Cos(float angle)
Returns cosinus of angle in radians.
static proto float Sin(float angle)
Returns sinus of angle in radians.
static const float DEG2RAD
Определения EnMath.c:17
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
proto int ToLower()
Changes string to lowercase. Returns length.
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/tools/tools.c:8