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

◆ CheckSlotVerticalDistance()

bool bsbDebugPrint::CheckSlotVerticalDistance ( int slot_id,
PlayerBase player )
protected

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

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