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

◆ FoldBaseBuildingObject()

ItemBase bsbDebugPrint::FoldBaseBuildingObject ( )
protected

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

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