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

◆ SoundBuildStart()

void bsbDebugPrint::SoundBuildStart ( string part_name)
protected

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

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

Используется в ItemBase::OnPartBuiltClient().