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

◆ CanFoldBaseBuildingObject()

bool bsbDebugPrint::CanFoldBaseBuildingObject ( )
protected

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

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