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

◆ GetAttachmentSlots()

void bsbDebugPrint::GetAttachmentSlots ( EntityAI entity,
out array< string > attachment_slots )
protected

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

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

Используется в ItemBase::UpdatePhysics() и ItemBase::UpdateVisuals().