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

◆ IsTakeable()

override bool bsbDebugPrint::IsTakeable ( )
protected

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

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