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

◆ UpdatePhysics()

void bsbDebugPrint::UpdatePhysics ( )
protected

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

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