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

◆ CanPutIntoHands()

override bool bsbDebugPrint::CanPutIntoHands ( EntityAI parent)
protected

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

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