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

◆ CanReceiveAttachment()

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

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

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