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

◆ CanReceiveAttachment()

override bool bsbDebugPrint::CanReceiveAttachment ( EntityAI attachment,
int slotId )
protected

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

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