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

◆ MustBeBuiltFromOutside()

bool bsbDebugPrint::MustBeBuiltFromOutside ( )
protected

Some buildings can only be built from outside.

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

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