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

◆ UpdateNavmesh()

void bsbDebugPrint::UpdateNavmesh ( )
protected

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

2102{
2103 const string ANIMATION_DEPLOYED = "Deployed";
2104
2105 float m_ConstructionKitHealth; //stored health value for used construction kit
2106
2107 bool m_HasBase;
2108 //variables for synchronization of base building parts (2x31 is the current limit)
2109 int m_SyncParts01; //synchronization for already built parts (31 parts)
2110 int m_SyncParts02; //synchronization for already built parts (+31 parts)
2111 int m_SyncParts03; //synchronization for already built parts (+31 parts)
2112 int m_InteractedPartId; //construction part id that an action was performed on
2113 int m_PerformedActionId; //action id that was performed on a construction part
2114 protected ref ConstructionBasic m_Construction;
2115
2116 //Sounds
2117 //build
2118 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
2119 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
2120 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
2121 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
2122 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
2123 //dismantle
2124 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
2125 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
2126 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
2127 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
2128 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
2129
2130 protected EffectSound m_Sound;
2131
2135
2136 // Constructor
2137 void BaseBuildingBase()
2138 {
2140
2141 //synchronized variables
2142 RegisterNetSyncVariableInt( "m_SyncParts01" );
2143 RegisterNetSyncVariableInt( "m_SyncParts02" );
2144 RegisterNetSyncVariableInt( "m_SyncParts03" );
2145 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2146 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2147 RegisterNetSyncVariableBool( "m_HasBase" );
2148
2149 //Construction init
2150 ConstructionInit();
2151
2152 if (ConfigIsExisting("hybridAttachments"))
2153 {
2155 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
2156 }
2157 if (ConfigIsExisting("mountables"))
2158 {
2160 ConfigGetTextArray("mountables", m_Mountables);
2161 }
2162
2163 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
2164 SetAllowDamage(true);
2165 }
2166
2167 override string GetInvulnerabilityTypeString()
2168 {
2169 return "disableBaseDamage";
2170 }
2171
2172 override bool CanObstruct()
2173 {
2174 return true;
2175 }
2176
2177 override int GetHideIconMask()
2178 {
2179 return EInventoryIconVisibility.HIDE_VICINITY;
2180 }
2181
2182 override void InitItemSounds()
2183 {
2184 super.InitItemSounds();
2185
2187 SoundParameters params = new SoundParameters();
2188 params.m_Loop = true;
2189
2190 if (GetFoldSoundset() != string.Empty)
2191 handler.AddSound(SoundConstants.ITEM_FOLD, GetFoldSoundset());
2192 if (GetLoopFoldSoundset() != string.Empty)
2193 handler.AddSound(SoundConstants.ITEM_FOLD_LOOP, GetLoopFoldSoundset(), params);
2194 }
2195
2196 override string GetFoldSoundset()
2197 {
2198 return "putDown_FenceKit_SoundSet";
2199 }
2200
2201 override string GetLoopFoldSoundset()
2202 {
2203 return "Shelter_Site_Build_Loop_SoundSet";
2204 }
2205
2206 // --- SYNCHRONIZATION
2208 {
2209 if ( g_Game.IsServer() )
2210 {
2211 SetSynchDirty();
2212 }
2213 }
2214
2215 override void OnVariablesSynchronized()
2216 {
2217 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
2218 super.OnVariablesSynchronized();
2219
2220 g_Game.GetCallQueue( CALL_CATEGORY_GAMEPLAY ).CallLater( OnSynchronizedClient, 100, false );
2221 }
2222
2223 protected void OnSynchronizedClient()
2224 {
2225 //update parts
2227
2228 //update action on part
2230
2231 //update visuals (client)
2232 UpdateVisuals();
2233 }
2234
2235 //parts synchronization
2236 void RegisterPartForSync( int part_id )
2237 {
2238 //part_id must starts from index = 1
2239 int offset;
2240 int mask;
2241
2242 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2243 {
2244 offset = part_id - 1;
2245 mask = 1 << offset;
2246
2247 m_SyncParts01 = m_SyncParts01 | mask;
2248 }
2249 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2250 {
2251 offset = ( part_id % 32 );
2252 mask = 1 << offset;
2253
2254 m_SyncParts02 = m_SyncParts02 | mask;
2255 }
2256 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2257 {
2258 offset = ( part_id % 63 );
2259 mask = 1 << offset;
2260
2261 m_SyncParts03 = m_SyncParts03 | mask;
2262 }
2263 }
2264
2265 void UnregisterPartForSync( int part_id )
2266 {
2267 //part_id must starts from index = 1
2268 int offset;
2269 int mask;
2270
2271 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2272 {
2273 offset = part_id - 1;
2274 mask = 1 << offset;
2275
2276 m_SyncParts01 = m_SyncParts01 & ~mask;
2277 }
2278 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2279 {
2280 offset = ( part_id % 32 );
2281 mask = 1 << offset;
2282
2283 m_SyncParts02 = m_SyncParts02 & ~mask;
2284 }
2285 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2286 {
2287 offset = ( part_id % 63 );
2288 mask = 1 << offset;
2289
2290 m_SyncParts03 = m_SyncParts03 & ~mask;
2291 }
2292 }
2293
2294 bool IsPartBuildInSyncData( int part_id )
2295 {
2296 //part_id must starts from index = 1
2297 int offset;
2298 int mask;
2299
2300 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2301 {
2302 offset = part_id - 1;
2303 mask = 1 << offset;
2304
2305 if ( ( m_SyncParts01 & mask ) > 0 )
2306 {
2307 return true;
2308 }
2309 }
2310 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2311 {
2312 offset = ( part_id % 32 );
2313 mask = 1 << offset;
2314
2315 if ( ( m_SyncParts02 & mask ) > 0 )
2316 {
2317 return true;
2318 }
2319 }
2320 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2321 {
2322 offset = ( part_id % 63 );
2323 mask = 1 << offset;
2324
2325 if ( ( m_SyncParts03 & mask ) > 0 )
2326 {
2327 return true;
2328 }
2329 }
2330
2331 return false;
2332 }
2333
2334 protected void RegisterActionForSync( int part_id, int action_id )
2335 {
2336 m_InteractedPartId = part_id;
2337 m_PerformedActionId = action_id;
2338 }
2339
2340 protected void ResetActionSyncData()
2341 {
2342 //reset data
2343 m_InteractedPartId = -1;
2345 }
2346
2347 protected void SetActionFromSyncData()
2348 {
2349 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
2350 {
2352 int build_action_id = m_PerformedActionId;
2353
2354 switch( build_action_id )
2355 {
2356 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
2357 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
2358 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
2359 }
2360 }
2361 }
2362 //------
2363
2365 {
2366 string key = part.GetPartName();
2367 bool is_base = part.IsBase();
2368 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
2369 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
2370 if ( is_part_built_sync )
2371 {
2372 if ( !part.IsBuilt() )
2373 {
2374 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
2375 GetConstruction().AddToConstructedParts( key );
2376 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
2377
2378 if (is_base)
2379 {
2381 RemoveProxyPhysics( ANIMATION_DEPLOYED );
2382 }
2383 }
2384 }
2385 else
2386 {
2387 if ( part.IsBuilt() )
2388 {
2389 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
2390 GetConstruction().RemoveFromConstructedParts( key );
2391 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
2392
2393 if (is_base)
2394 {
2396 AddProxyPhysics( ANIMATION_DEPLOYED );
2397 }
2398 }
2399 }
2400
2401 //check slot lock for material attachments
2402 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
2403 }
2404
2405 //set construction parts based on synchronized data
2407 {
2408 Construction construction = GetConstruction();
2409 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2410
2411 for ( int i = 0; i < construction_parts.Count(); ++i )
2412 {
2413 string key = construction_parts.GetKey( i );
2414 ConstructionPart value = construction_parts.Get( key );
2415 SetPartFromSyncData(value);
2416 }
2417
2418 //regenerate navmesh
2419 UpdateNavmesh();
2420 }
2421
2422 protected ConstructionPart GetConstructionPartById( int id )
2423 {
2424 Construction construction = GetConstruction();
2425 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2426
2427 for ( int i = 0; i < construction_parts.Count(); ++i )
2428 {
2429 string key = construction_parts.GetKey( i );
2430 ConstructionPart value = construction_parts.Get( key );
2431
2432 if ( value.GetId() == id )
2433 {
2434 return value;
2435 }
2436 }
2437
2438 return NULL;
2439 }
2440 //
2441
2442 //Base
2443 bool HasBase()
2444 {
2445 return m_HasBase;
2446 }
2447
2448 void SetBaseState( bool has_base )
2449 {
2450 m_HasBase = has_base;
2451 }
2452
2453 override bool IsDeployable()
2454 {
2455 return true;
2456 }
2457
2458 bool IsOpened()
2459 {
2460 return false;
2461 }
2462
2463 //--- CONSTRUCTION KIT
2465 {
2466 ItemBase construction_kit = ItemBase.Cast( g_Game.CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
2467 if ( m_ConstructionKitHealth > 0 )
2468 {
2469 construction_kit.SetHealth( m_ConstructionKitHealth );
2470 }
2471
2472 return construction_kit;
2473 }
2474
2475 void CreateConstructionKitInHands(notnull PlayerBase player)
2476 {
2477 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2478 if ( m_ConstructionKitHealth > 0 )
2479 {
2480 construction_kit.SetHealth( m_ConstructionKitHealth );
2481 }
2482 }
2483
2484 protected vector GetKitSpawnPosition()
2485 {
2486 return GetPosition();
2487 }
2488
2489 protected string GetConstructionKitType()
2490 {
2491 return "";
2492 }
2493
2494 void DestroyConstructionKit( ItemBase construction_kit )
2495 {
2496 m_ConstructionKitHealth = construction_kit.GetHealth();
2497 g_Game.ObjectDelete( construction_kit );
2498 }
2499
2500 //--- CONSTRUCTION
2501 void DestroyConstruction()
2502 {
2503 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2504 g_Game.ObjectDelete( this );
2505 }
2506
2507 // --- EVENTS
2508 override void EEDelete(EntityAI parent)
2509 {
2510 super.EEDelete(parent);
2511
2512 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
2513 {
2514 areaDamage.Destroy();
2515 }
2516
2517 }
2518
2519 override void OnStoreSave( ParamsWriteContext ctx )
2520 {
2521 super.OnStoreSave( ctx );
2522
2523 //sync parts 01
2524 ctx.Write( m_SyncParts01 );
2525 ctx.Write( m_SyncParts02 );
2526 ctx.Write( m_SyncParts03 );
2527
2528 ctx.Write( m_HasBase );
2529 }
2530
2531 override bool OnStoreLoad( ParamsReadContext ctx, int version )
2532 {
2533 if ( !super.OnStoreLoad( ctx, version ) )
2534 return false;
2535
2536 //--- Base building data ---
2537 //Restore synced parts data
2538 if ( !ctx.Read( m_SyncParts01 ) )
2539 {
2540 m_SyncParts01 = 0; //set default
2541 return false;
2542 }
2543 if ( !ctx.Read( m_SyncParts02 ) )
2544 {
2545 m_SyncParts02 = 0; //set default
2546 return false;
2547 }
2548 if ( !ctx.Read( m_SyncParts03 ) )
2549 {
2550 m_SyncParts03 = 0; //set default
2551 return false;
2552 }
2553
2554 //has base
2555 if ( !ctx.Read( m_HasBase ) )
2556 {
2557 m_HasBase = false;
2558 return false;
2559 }
2560 //---
2561
2562 return true;
2563 }
2564
2565 override void AfterStoreLoad()
2566 {
2567 super.AfterStoreLoad();
2568
2570 {
2572 }
2573 }
2574
2576 {
2577 //update server data
2579
2580 //set base state
2581 ConstructionPart part = GetConstruction().GetBaseConstructionPart();
2582 SetBaseState( part.IsBuilt() ) ;
2583
2584 //synchronize after load
2586 }
2587
2588 override void OnCreatePhysics()
2589 {
2590 super.OnCreatePhysics();
2591
2592 ConstructionInit();
2594 }
2595
2596 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2597 {
2599 return;
2600
2601 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2602 }
2603
2604 override void EEOnAfterLoad()
2605 {
2607 {
2608 g_Game.GetCallQueue( CALL_CATEGORY_GAMEPLAY ).CallLater( SetPartsAfterStoreLoad, 500, false, this ); //todo: check damage system config presence and 'HasDamageSystem' instead?
2609 }
2610
2611 super.EEOnAfterLoad();
2612 }
2613
2614 override void EEItemAttached( EntityAI item, string slot_name )
2615 {
2616 super.EEItemAttached( item, slot_name );
2617
2618 CheckForHybridAttachments( item, slot_name );
2619 UpdateVisuals();
2620 UpdateAttachmentPhysics( slot_name, false );
2621 }
2622
2623 override void EEItemDetached( EntityAI item, string slot_name )
2624 {
2625 super.EEItemDetached( item, slot_name );
2626
2627 UpdateVisuals();
2628 UpdateAttachmentPhysics( slot_name, false );
2629 }
2630
2631 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
2632 {
2633 string slot_name = InventorySlots.GetSlotName( slotId );
2634 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
2635
2636 UpdateAttachmentVisuals( slot_name, locked );
2637 UpdateAttachmentPhysics( slot_name, locked );
2638 }
2639
2640 //ignore out of reach condition
2641 override bool IgnoreOutOfReachCondition()
2642 {
2643 return true;
2644 }
2645
2646 //CONSTRUCTION EVENTS
2647 //Build
2648 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
2649 {
2650 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2651
2652 //check base state
2653 if (construtionPart.IsBase())
2654 {
2655 SetBaseState(true);
2656
2657 //spawn kit
2659 }
2660
2661 //register constructed parts for synchronization
2662 RegisterPartForSync(construtionPart.GetId());
2663
2664 //register action that was performed on part
2665 RegisterActionForSync(construtionPart.GetId(), action_id);
2666
2667 //synchronize
2669
2670 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
2671
2672 UpdateNavmesh();
2673
2674 //update visuals
2675 UpdateVisuals();
2676
2677 //reset action sync data
2678 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(ResetActionSyncData, 100, false, this);
2679 }
2680
2681 void OnPartBuiltClient(string part_name, int action_id)
2682 {
2683 //play sound
2684 SoundBuildStart( part_name );
2685 }
2686
2687 //Dismantle
2688 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
2689 {
2690 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
2691 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2692
2693 //register constructed parts for synchronization
2694 UnregisterPartForSync(construtionPart.GetId());
2695
2696 //register action that was performed on part
2697 RegisterActionForSync(construtionPart.GetId(), action_id);
2698
2699 //synchronize
2701
2702 // server part of sync, client will be synced from SetPartsFromSyncData
2703 SetPartFromSyncData(construtionPart);
2704
2705 UpdateNavmesh();
2706
2707 //update visuals
2708 UpdateVisuals();
2709
2710 //reset action sync data
2711 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(ResetActionSyncData, 100, false, this);
2712
2713 //check base state
2714 if (construtionPart.IsBase())
2715 {
2716 //Destroy construction
2717 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(DestroyConstruction, 200, false, this);
2718 }
2719 }
2720
2721 void OnPartDismantledClient( string part_name, int action_id )
2722 {
2723 //play sound
2724 SoundDismantleStart( part_name );
2725 }
2726
2727 //Destroy
2728 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
2729 {
2730 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
2731 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2732
2733 //register constructed parts for synchronization
2734 UnregisterPartForSync(construtionPart.GetId());
2735
2736 //register action that was performed on part
2737 RegisterActionForSync(construtionPart.GetId(), action_id);
2738
2739 //synchronize
2741
2742 // server part of sync, client will be synced from SetPartsFromSyncData
2743 SetPartFromSyncData(construtionPart);
2744
2745 UpdateNavmesh();
2746
2747 //update visuals
2748 UpdateVisuals();
2749
2750 //reset action sync data
2751 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(ResetActionSyncData, 100, false, this);
2752
2753 //check base state
2754 if (construtionPart.IsBase())
2755 {
2756 //Destroy construction
2757 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(DestroyConstruction, 200, false, this);
2758 }
2759 }
2760
2761 void OnPartDestroyedClient( string part_name, int action_id )
2762 {
2763 //play sound
2764 SoundDestroyStart( part_name );
2765 }
2766
2767 // --- UPDATE
2768 void InitBaseState()
2769 {
2770 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
2771
2772 InitVisuals();
2773 UpdateNavmesh(); //regenerate navmesh
2774 }
2775
2776 void InitVisuals()
2777 {
2778 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
2779 //check base
2780 if ( !HasBase() )
2781 {
2782 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
2783 }
2784 else
2785 {
2786 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
2787 }
2788
2789 GetConstruction().InitVisuals();
2790 }
2791
2792 void UpdateVisuals()
2793 {
2794 array<string> attachmentSlots = new array<string>;
2795
2796 GetAttachmentSlots(this, attachmentSlots);
2797 foreach (string slotName : attachmentSlots)
2798 {
2800 }
2801
2802 //check base
2803 if (!HasBase())
2804 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
2805 else
2806 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
2807
2808 GetConstruction().UpdateVisuals();
2809 }
2810
2811 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
2812 {
2813 string slotNameMounted = slot_name + "_Mounted";
2814 EntityAI attachment = FindAttachmentBySlotName(slot_name);
2815
2816 if (attachment)
2817 {
2818 BarbedWire barbedWire = BarbedWire.Cast(attachment);
2819 if (barbedWire && barbedWire.IsMounted())
2820 CreateAreaDamage(slotNameMounted);
2821 else
2822 DestroyAreaDamage(slotNameMounted);
2823
2824 if (is_locked)
2825 {
2826 SetAnimationPhase(slotNameMounted, 0);
2827 SetAnimationPhase(slot_name, 1);
2828 }
2829 else
2830 {
2831 SetAnimationPhase(slotNameMounted, 1);
2832 SetAnimationPhase(slot_name, 0);
2833 }
2834 }
2835 else
2836 {
2837 SetAnimationPhase(slotNameMounted, 1);
2838 SetAnimationPhase(slot_name, 1);
2839
2840 DestroyAreaDamage(slotNameMounted);
2841 }
2842 }
2843
2844 // avoid calling this function on frequent occasions, it's a massive performance hit
2845 void UpdatePhysics()
2846 {
2848 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
2849
2850 array<string> attachmentSlots = new array<string>;
2851 GetAttachmentSlots(this, attachmentSlots);
2852
2854 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
2855
2856 foreach (string slotName : attachmentSlots)
2857 {
2859 }
2860
2861 //check base
2862 if (!HasBase())
2863 {
2865 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
2866
2867 AddProxyPhysics(ANIMATION_DEPLOYED);
2868 }
2869 else
2870 {
2872 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
2873
2874 RemoveProxyPhysics(ANIMATION_DEPLOYED);
2875 }
2876
2877 GetConstruction().UpdatePhysics();
2878 UpdateNavmesh();
2879 }
2880
2881 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
2882 {
2883 //checks for invalid appends; hotfix
2884 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
2885 return;
2886 //----------------------------------
2887 string slot_name_mounted = slot_name + "_Mounted";
2888 EntityAI attachment = FindAttachmentBySlotName( slot_name );
2889
2890 //remove proxy physics
2891 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
2892 RemoveProxyPhysics( slot_name_mounted );
2893 RemoveProxyPhysics( slot_name );
2894
2895 if ( attachment )
2896 {
2897 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
2898 if ( is_locked )
2899 {
2900 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
2901 AddProxyPhysics( slot_name_mounted );
2902 }
2903 else
2904 {
2905 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
2906 AddProxyPhysics( slot_name );
2907 }
2908 }
2909 }
2910
2911 protected void UpdateNavmesh()
2912 {
2913 SetAffectPathgraph( true, false );
2914 g_Game.GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( g_Game.UpdatePathgraphRegionByObject, 100, false, this );
2915 }
2916
2917 override bool CanUseConstruction()
2918 {
2919 return true;
2920 }
2921
2922 override bool CanUseConstructionBuild()
2923 {
2924 return true;
2925 }
2926
2927 protected bool IsAttachmentSlotLocked( EntityAI attachment )
2928 {
2929 if ( attachment )
2930 {
2931 InventoryLocation inventory_location = new InventoryLocation;
2932 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
2933
2934 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
2935 }
2936
2937 return false;
2938 }
2939
2940 protected bool IsAttachmentSlotLocked( string slot_name )
2941 {
2942 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
2943 }
2944
2945 //--- ATTACHMENT SLOTS
2946 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
2947 {
2948 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
2949 if ( g_Game.ConfigIsExisting( config_path ) )
2950 {
2951 g_Game.ConfigGetTextArray( config_path, attachment_slots );
2952 }
2953 }
2954
2955 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
2956 {
2957 return true;
2958 }
2959
2960 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
2961 {
2962 return true;
2963 }
2964
2965 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
2966 {
2967 return true;
2968 }
2969
2970 // --- INIT
2972 {
2973 m_Construction = new Construction(this);
2974 return m_Construction;
2975 }
2976
2978 {
2979 return m_Construction;
2980 }
2981
2983 {
2984 return Construction.Cast(m_Construction);
2985 }
2986
2988 {
2989 int attachment_count = GetInventory().AttachmentCount();
2990 if ( attachment_count > 0 )
2991 {
2992 if ( HasBase() && attachment_count == 1 )
2993 {
2994 return false;
2995 }
2996
2997 return true;
2998 }
2999
3000 return false;
3001 }
3002
3003 override bool ShowZonesHealth()
3004 {
3005 return true;
3006 }
3007
3008 override bool IsTakeable()
3009 {
3010 return false;
3011 }
3012
3013 //this into/outo parent.Cargo
3014 override bool CanPutInCargo( EntityAI parent )
3015 {
3016 return false;
3017 }
3018
3019 override bool CanRemoveFromCargo( EntityAI parent )
3020 {
3021 return false;
3022 }
3023
3024 //hands
3025 override bool CanPutIntoHands( EntityAI parent )
3026 {
3027 return false;
3028 }
3029
3030 //--- ACTION CONDITIONS
3031 //direction
3032 override bool IsFacingPlayer( PlayerBase player, string selection )
3033 {
3034 return true;
3035 }
3036
3037 override bool IsPlayerInside( PlayerBase player, string selection )
3038 {
3039 return true;
3040 }
3041
3044 {
3045 return false;
3046 }
3047
3048 //roof check
3049 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
3050 {
3051 return false;
3052 }
3053
3054 //selection->player distance check
3055 bool HasProperDistance( string selection, PlayerBase player )
3056 {
3057 return true;
3058 }
3059
3060 //folding
3062 {
3063 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
3064 {
3065 return false;
3066 }
3067
3068 return true;
3069 }
3070
3072 {
3075
3076 return item;
3077 }
3078
3079 //Damage triggers (barbed wire)
3080 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
3081 {
3082 if ( g_Game && g_Game.IsServer() )
3083 {
3084 //destroy area damage if some already exists
3085 DestroyAreaDamage( slot_name );
3086
3087 //create new area damage
3089 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
3090
3091 vector min_max[2];
3092 if ( MemoryPointExists( slot_name + "_min" ) )
3093 {
3094 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3095 }
3096 if ( MemoryPointExists( slot_name + "_max" ) )
3097 {
3098 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3099 }
3100
3101 //get proper trigger extents (min<max)
3102 vector extents[2];
3103 GetConstruction().GetTriggerExtents( min_max, extents );
3104
3105 //get box center
3106 vector center;
3107 center = GetConstruction().GetBoxCenter( min_max );
3108 center = ModelToWorld( center );
3109
3110 //rotate center if needed
3112 CalcDamageAreaRotation( rotation_angle, center, orientation );
3113
3114 areaDamage.SetExtents( extents[0], extents[1] );
3115 areaDamage.SetAreaPosition( center );
3116 areaDamage.SetAreaOrientation( orientation );
3117 areaDamage.SetLoopInterval( 1.0 );
3118 areaDamage.SetDeferDuration( 0.2 );
3119 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3120 areaDamage.SetAmmoName( "BarbedWireHit" );
3121 areaDamage.Spawn();
3122
3123 m_DamageTriggers.Insert( slot_name, areaDamage );
3124 }
3125 }
3126
3127 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
3128 {
3129 if ( angle_deg != 0 )
3130 {
3131 //orientation
3132 orientation[0] = orientation[0] - angle_deg;
3133
3134 //center
3135 vector rotate_axis;
3136 if ( MemoryPointExists( "rotate_axis" ) )
3137 {
3138 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3139 }
3140 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];
3141 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];
3142 center[0] = r_center_x;
3143 center[2] = r_center_z;
3144 }
3145 }
3146
3147 void DestroyAreaDamage( string slot_name )
3148 {
3149 if (g_Game && g_Game.IsServer())
3150 {
3152 if (m_DamageTriggers.Find(slot_name, areaDamage))
3153 {
3154 if (areaDamage)
3155 {
3156 areaDamage.Destroy();
3157 }
3158
3159 m_DamageTriggers.Remove( slot_name );
3160 }
3161 }
3162 }
3163
3164 override bool IsIgnoredByConstruction()
3165 {
3166 return true;
3167 }
3168
3169 //================================================================
3170 // SOUNDS
3171 //================================================================
3172 protected void SoundBuildStart( string part_name )
3173 {
3174 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
3175 }
3176
3177 protected void SoundDismantleStart( string part_name )
3178 {
3179 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3180 }
3181
3182 protected void SoundDestroyStart( string part_name )
3183 {
3184 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3185 }
3186
3187 protected string GetBuildSoundByMaterial( string part_name )
3188 {
3189 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3190
3191 switch ( material_type )
3192 {
3193 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
3194 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
3195 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
3196 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
3197 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
3198 }
3199
3200 return "";
3201 }
3202
3203 protected string GetDismantleSoundByMaterial( string part_name )
3204 {
3205 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3206
3207 switch ( material_type )
3208 {
3209 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
3210 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
3211 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
3212 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
3213 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
3214 }
3215
3216 return "";
3217 }
3218
3219 //misc
3220 void CheckForHybridAttachments( EntityAI item, string slot_name )
3221 {
3222 if (!g_Game.IsMultiplayer() || g_Game.IsServer())
3223 {
3224 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
3225 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
3226 {
3227 SetHealth(slot_name,"Health",item.GetHealth());
3228 }
3229 }
3230 }
3231
3232 override int GetDamageSystemVersionChange()
3233 {
3234 return 111;
3235 }
3236
3237 override void SetActions()
3238 {
3239 super.SetActions();
3240
3244 }
3245
3246 protected void DestroyConstructedParts()
3247 {
3248 Construction construction = GetConstruction();
3249 if (!construction)
3250 return;
3251
3252 map<string, ref ConstructionPart> constructionParts = construction.GetConstructionParts();
3253 for ( int i = constructionParts.Count() - 1; i >= 0; --i )
3254 {
3255 ConstructionPart part = constructionParts.GetElement(i);
3256 if (part && part.IsBuilt() && !part.IsUtilityPart())
3257 {
3258 construction.DestroyPartServer(null, part.GetPartName(), -1);
3259 }
3260 }
3261 }
3262
3263 protected void HandleFallingForConstructedParts()
3264 {
3265 Construction construction = GetConstruction();
3266 if (!construction)
3267 return;
3268
3269 map<string, ref ConstructionPart> constructionParts = construction.GetConstructionParts();
3270 for ( int i = constructionParts.Count() - 1; i >= 0; --i )
3271 {
3272 ConstructionPart part = constructionParts.GetElement(i);
3273 if (part && part.IsBuilt() && !part.IsUtilityPart())
3274 {
3275 construction.HandleEntityFalling(part.GetPartName());
3276 }
3277 }
3278 }
3279
3281 override void OnItemFallRebuilding()
3282 {
3283 if (!g_Game.IsServer())
3284 return;
3285
3288
3289 if (DestroyOnFall())
3290 {
3292 {
3294 }
3295 else
3296 {
3298 {
3300 }
3301 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(g_Game.ObjectDelete, 100, false, this);
3302 }
3303 }
3304 }
3305
3307 {
3308 if (HasAnyAttachmentsOrCargo())
3309 {
3311 MiscGameplayFunctions.ThrowAllItemsInInventoryEx(this, ThrowEntityFlags.NONE, vector.Zero);
3312 }
3313 }
3314
3315 //================================================================
3316 // DEBUG
3317 //================================================================
3318
3321 {
3322 return null;
3323 }
3324
3325 override void OnDebugSpawn()
3326 {
3327 FullyBuild();
3328 }
3329
3330 void FullyBuild()
3331 {
3333 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
3334
3335 Man p;
3336
3337 #ifdef SERVER
3338 array<Man> players = new array<Man>;
3339 g_Game.GetWorld().GetPlayerList(players);
3340 if (players.Count())
3341 p = players[0];
3342 #else
3343 p = g_Game.GetPlayer();
3344 #endif
3345
3346 foreach (ConstructionPart part : parts)
3347 {
3348 bool excluded = false;
3349 string partName = part.GetPartName();
3350 if (excludes)
3351 {
3352 foreach (string exclude : excludes)
3353 {
3354 if (partName.Contains(exclude))
3355 {
3356 excluded = true;
3357 break;
3358 }
3359 }
3360 }
3361
3362 if (!excluded)
3363 {
3364 OnPartBuiltServer(p, partName, AT_BUILD_PART);
3365 }
3366 }
3367
3368 GetConstruction().UpdateVisuals();
3369 }
3370
3372 //Deprecated code playpen//
3374 [Obsolete("handled in the Construction component directly")]
3375 protected void HandleItemFalling(ConstructionPart part)
3376 {
3377 }
3378
3379 [Obsolete("handled in the Construction component directly")]
3380 protected void ItemFall(vector min, vector max)
3381 {
3382 }
3383
3384 [Obsolete("obsolete debug method")]
3385 protected void DebugCustomState()
3386 {
3387 }
3388}
3389
3390void bsbDebugPrint (string s)
3391{
3392#ifdef BSB_DEBUG
3393 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3394#else
3395 //Print("" + s); // comment/uncomment to hide/see debug logs
3396#endif
3397}
3398void bsbDebugSpam (string s)
3399{
3400#ifdef BSB_DEBUG_SPAM
3401 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3402#else
3403 //Print("" + s); // comment/uncomment to hide/see debug logs
3404#endif
3405}
const int AT_DISMANTLE_PART
const int AT_DESTROY_PART
const int AT_BUILD_PART
ref ConstructionBasic m_Construction
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:1910
const string ANIMATION_DEPLOYED
Определения BaseBuildingBase.c:1292
override int GetHideIconMask()
Определения BaseBuildingBase.c:1366
override void OnStoreSave(ParamsWriteContext ctx)
Определения BaseBuildingBase.c:1708
void FullyBuild()
Определения BaseBuildingBase.c:2519
void UpdateVisuals()
Определения BaseBuildingBase.c:1981
void SetActionFromSyncData()
Определения BaseBuildingBase.c:1536
int m_SyncParts01
Определения BaseBuildingBase.c:1298
void UpdateNavmesh()
Определения BaseBuildingBase.c:2100
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2149
override void OnDebugSpawn()
Определения BaseBuildingBase.c:2514
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения BaseBuildingBase.c:2509
void DropAttachmentAndCargoItems()
Определения BaseBuildingBase.c:2495
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:2371
const string SOUND_BUILD_WOOD_LOG
Определения BaseBuildingBase.c:1307
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:2361
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2000
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:2316
override bool CanObstruct()
Определения BaseBuildingBase.c:1361
bool HasAttachmentsBesidesBase()
Определения BaseBuildingBase.c:2176
override void InitItemSounds()
Определения BaseBuildingBase.c:1371
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1425
ConstructionBasic CreateConstructionComponent()
Определения BaseBuildingBase.c:2160
const string SOUND_DISMANTLE_METAL
Определения BaseBuildingBase.c:1316
void InitBaseState()
Определения BaseBuildingBase.c:1957
void BaseBuildingBase()
Определения BaseBuildingBase.c:1326
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:1764
void DestroyConstruction()
Определения BaseBuildingBase.c:1690
ref array< string > m_HybridAttachments
Определения BaseBuildingBase.c:1322
int m_InteractedPartId
Определения BaseBuildingBase.c:1301
override string GetFoldSoundset()
Определения BaseBuildingBase.c:1385
bool m_HasBase
Определения BaseBuildingBase.c:1296
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2392
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:2116
void UpdatePhysics()
Определения BaseBuildingBase.c:2034
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2221
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1870
bool HasProperDistance(string selection, PlayerBase player)
Определения BaseBuildingBase.c:2244
override void OnCreatePhysics()
Определения BaseBuildingBase.c:1777
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1837
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:1523
const string SOUND_BUILD_WOOD_PLANK
Определения BaseBuildingBase.c:1308
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:1595
ref array< string > m_Mountables
Определения BaseBuildingBase.c:1323
const string SOUND_BUILD_WIRE
Определения BaseBuildingBase.c:1311
int m_SyncParts03
Определения BaseBuildingBase.c:1300
void ResetActionSyncData()
Определения BaseBuildingBase.c:1529
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:1356
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1877
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:2409
override void EEOnAfterLoad()
Определения BaseBuildingBase.c:1793
override void EEItemDetached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1812
vector GetKitSpawnPosition()
Определения BaseBuildingBase.c:1673
override void OnItemFallRebuilding()
@Note for modders: This method and is subject to change!
Определения BaseBuildingBase.c:2470
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
Определения BaseBuildingBase.c:2144
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:2135
override bool IsDeployable()
Определения BaseBuildingBase.c:1642
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1950
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1454
void bsbDebugSpam(string s)
Определения BaseBuildingBase.c:1299
override void OnVariablesSynchronized()
Определения BaseBuildingBase.c:1404
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения BaseBuildingBase.c:2238
Construction GetConstruction()
Определения BaseBuildingBase.c:2171
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:2366
void DebugCustomState()
Определения BaseBuildingBase.c:2574
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:1611
string GetConstructionKitType()
Определения BaseBuildingBase.c:1678
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2154
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения BaseBuildingBase.c:1917
bool CanFoldBaseBuildingObject()
Определения BaseBuildingBase.c:2250
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:2421
const string SOUND_DISMANTLE_WOOD_PLANK
Определения BaseBuildingBase.c:1314
override void EEItemAttached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1803
const string SOUND_DISMANTLE_WOOD_LOG
Определения BaseBuildingBase.c:1313
void InitVisuals()
Определения BaseBuildingBase.c:1965
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
Определения BaseBuildingBase.c:1291
const string SOUND_BUILD_WOOD_STAIRS
Определения BaseBuildingBase.c:1309
ItemBase FoldBaseBuildingObject()
Определения BaseBuildingBase.c:2260
override ConstructionBasic GetConstructionBasic()
Определения BaseBuildingBase.c:2166
override bool CanPutInCargo(EntityAI parent)
Определения BaseBuildingBase.c:2203
override bool CanUseConstruction()
Определения BaseBuildingBase.c:2106
override void AfterStoreLoad()
Определения BaseBuildingBase.c:1754
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:1553
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:1785
override bool IgnoreOutOfReachCondition()
Определения BaseBuildingBase.c:1830
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BaseBuildingBase.c:1720
override bool ShowZonesHealth()
Определения BaseBuildingBase.c:2192
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2070
void HandleFallingForConstructedParts()
Определения BaseBuildingBase.c:2452
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2226
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2376
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:1653
const string SOUND_DISMANTLE_WIRE
Определения BaseBuildingBase.c:1317
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
Определения BaseBuildingBase.c:2232
override bool IsTakeable()
Определения BaseBuildingBase.c:2197
float m_ConstructionKitHealth
Определения BaseBuildingBase.c:1294
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:1697
override void SetActions()
Определения BaseBuildingBase.c:2426
void HandleItemFalling(ConstructionPart part)
Определения BaseBuildingBase.c:2564
void DestroyConstructionKit(ItemBase construction_kit)
Определения BaseBuildingBase.c:1683
void CreateConstructionKitInHands(notnull PlayerBase player)
Определения BaseBuildingBase.c:1664
bool IsOpened()
Определения BaseBuildingBase.c:1647
void ItemFall(vector min, vector max)
Определения BaseBuildingBase.c:2569
int m_PerformedActionId
Определения BaseBuildingBase.c:1302
override bool CanUseConstructionBuild()
Определения BaseBuildingBase.c:2111
bool HasBase()
Определения BaseBuildingBase.c:1632
void OnSynchronizedClient()
Определения BaseBuildingBase.c:1412
void SynchronizeBaseState()
Определения BaseBuildingBase.c:1396
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:2353
ref map< string, ref AreaDamageManager > m_DamageTriggers
Определения BaseBuildingBase.c:1321
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:1637
const string SOUND_BUILD_METAL
Определения BaseBuildingBase.c:1310
override string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:1390
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
Определения BaseBuildingBase.c:1820
override bool CanPutIntoHands(EntityAI parent)
Определения BaseBuildingBase.c:2214
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:1483
override bool CanRemoveFromCargo(EntityAI parent)
Определения BaseBuildingBase.c:2208
int m_SyncParts02
Определения BaseBuildingBase.c:1299
void DestroyConstructedParts()
Определения BaseBuildingBase.c:2435
const string SOUND_DISMANTLE_WOOD_STAIRS
Определения BaseBuildingBase.c:1315
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:38
PlayerSpawnPreset slotName
ConstructionMaterialType
used to guide action sound selection, mostly. Could be also used for particles and stuff,...
Определения ConstructionBase.c:3
DayZGame g_Game
Определения DayZGame.c:4074
vector orientation
Определения DustKickupEffects.c:21
void DestroyAreaDamage()
Определения FireplaceBase.c:2363
void CreateAreaDamage()
Определения FireplaceBase.c:2347
Empty
Определения Hand_States.c:14
EffectSound m_Sound
Определения HungerSoundHandler.c:18
string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:1390
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:4407
string GetFoldSoundset()
Определения BaseBuildingBase.c:1385
bool m_FixDamageSystemInit
Определения ItemBase.c:61
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
ThrowEntityFlags
Определения MiscGameplayFunctions.c:208
Определения 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
static bool GetDisableRefundMaterialsOnFall()
Определения CfgGameplayHandler.c:362
static bool GetDisableDropAttachmentsOnFall()
Определения CfgGameplayHandler.c:357
static bool GetDisableItemFalling()
Определения CfgGameplayHandler.c:352
override void DestroyPartServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения Construction.c:93
just declared for module 3 use
Определения Construction_Basic.c:3
Used in BBB objects.
Определения Construction.c:3
int GetId()
Определения ConstructionPart.c:208
string GetPartName()
Определения ConstructionPart.c:198
bool IsBase()
Определения ConstructionPart.c:273
bool IsBuilt()
Определения ConstructionPart.c:160
bool IsUtilityPart()
Определения ConstructionPart.c:233
Instanced construction part data classes for dynamic data, statics now stored on EntityType level in ...
Определения ConstructionPart.c:4
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:30
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
static bool IsBaseBuildingLogEnable()
Определения 3_Game/DayZ/tools/Debug.c:809
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
Определения Transport.c:70
static const vector Zero
Определения EnConvert.c:123
Определения EnConvert.c:119
override string GetDebugName()
Определения dayzplayer.c:1191
Serializer ParamsReadContext
Определения gameplay.c:15
Serializer ParamsWriteContext
Определения gameplay.c:16
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
void Obsolete(string msg="")
Определения EnScript.c:371
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
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/DayZ/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8