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

◆ CalcDamageAreaRotation()

void bsbDebugPrint::CalcDamageAreaRotation ( float angle_deg,
out vector center,
out vector orientation )
protected

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

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

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