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

◆ UpdateAttachmentPhysics()

void bsbDebugPrint::UpdateAttachmentPhysics ( string slot_name,
bool is_locked )
protected

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

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

Используется в ItemBase::EEItemAttached(), ItemBase::EEItemDetached(), ItemBase::OnSetSlotLock() и ItemBase::UpdatePhysics().