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

◆ IsAttachmentSlotLocked() [2/2]

bool bsbDebugPrint::IsAttachmentSlotLocked ( string slot_name)
protected

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

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