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

◆ CanPutInCargo()

override bool bsbDebugPrint::CanPutInCargo ( EntityAI parent)
protected

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

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