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

◆ UpdateAttachmentVisuals()

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

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

2116{
2117 const string ANIMATION_DEPLOYED = "Deployed";
2118
2119 float m_ConstructionKitHealth; //stored health value for used construction kit
2120
2122
2123 bool m_HasBase;
2124 //variables for synchronization of base building parts (2x31 is the current limit)
2125 int m_SyncParts01; //synchronization for already built parts (31 parts)
2126 int m_SyncParts02; //synchronization for already built parts (+31 parts)
2127 int m_SyncParts03; //synchronization for already built parts (+31 parts)
2128 int m_InteractedPartId; //construction part id that an action was performed on
2129 int m_PerformedActionId; //action id that was performed on a construction part
2130
2131 //Sounds
2132 //build
2133 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
2134 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
2135 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
2136 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
2137 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
2138 //dismantle
2139 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
2140 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
2141 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
2142 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
2143 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
2144
2145 protected EffectSound m_Sound;
2146
2150
2151 // Constructor
2152 void BaseBuildingBase()
2153 {
2155
2156 //synchronized variables
2157 RegisterNetSyncVariableInt( "m_SyncParts01" );
2158 RegisterNetSyncVariableInt( "m_SyncParts02" );
2159 RegisterNetSyncVariableInt( "m_SyncParts03" );
2160 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2161 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2162 RegisterNetSyncVariableBool( "m_HasBase" );
2163
2164 //Construction init
2166
2167 if (ConfigIsExisting("hybridAttachments"))
2168 {
2170 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
2171 }
2172 if (ConfigIsExisting("mountables"))
2173 {
2175 ConfigGetTextArray("mountables", m_Mountables);
2176 }
2177
2178 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
2179 }
2180
2181 override void EEDelete(EntityAI parent)
2182 {
2183 super.EEDelete(parent);
2184
2185 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
2186 {
2187 areaDamage.Destroy();
2188 }
2189
2190 }
2191
2192 override string GetInvulnerabilityTypeString()
2193 {
2194 return "disableBaseDamage";
2195 }
2196
2197 override bool CanObstruct()
2198 {
2199 return true;
2200 }
2201
2202 override int GetHideIconMask()
2203 {
2204 return EInventoryIconVisibility.HIDE_VICINITY;
2205 }
2206
2207 override void InitItemSounds()
2208 {
2209 super.InitItemSounds();
2210
2212 SoundParameters params = new SoundParameters();
2213 params.m_Loop = true;
2214
2215 if (GetFoldSoundset() != string.Empty)
2216 handler.AddSound(SoundConstants.ITEM_FOLD, GetFoldSoundset());
2217 if (GetLoopFoldSoundset() != string.Empty)
2218 handler.AddSound(SoundConstants.ITEM_FOLD_LOOP, GetLoopFoldSoundset(), params);
2219 }
2220
2221 override string GetFoldSoundset()
2222 {
2223 return "putDown_FenceKit_SoundSet";
2224 }
2225
2226 override string GetLoopFoldSoundset()
2227 {
2228 return "Shelter_Site_Build_Loop_SoundSet";
2229 }
2230
2231 // --- SYNCHRONIZATION
2233 {
2234 if ( GetGame().IsServer() )
2235 {
2236 SetSynchDirty();
2237 }
2238 }
2239
2240 override void OnVariablesSynchronized()
2241 {
2242 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
2243 super.OnVariablesSynchronized();
2244
2246 }
2247
2248 protected void OnSynchronizedClient()
2249 {
2250 //update parts
2252
2253 //update action on part
2255
2256 //update visuals (client)
2257 UpdateVisuals();
2258 }
2259
2260 //parts synchronization
2261 void RegisterPartForSync( int part_id )
2262 {
2263 //part_id must starts from index = 1
2264 int offset;
2265 int mask;
2266
2267 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2268 {
2269 offset = part_id - 1;
2270 mask = 1 << offset;
2271
2272 m_SyncParts01 = m_SyncParts01 | mask;
2273 }
2274 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2275 {
2276 offset = ( part_id % 32 );
2277 mask = 1 << offset;
2278
2279 m_SyncParts02 = m_SyncParts02 | mask;
2280 }
2281 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2282 {
2283 offset = ( part_id % 63 );
2284 mask = 1 << offset;
2285
2286 m_SyncParts03 = m_SyncParts03 | mask;
2287 }
2288 }
2289
2290 void UnregisterPartForSync( int part_id )
2291 {
2292 //part_id must starts from index = 1
2293 int offset;
2294 int mask;
2295
2296 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2297 {
2298 offset = part_id - 1;
2299 mask = 1 << offset;
2300
2301 m_SyncParts01 = m_SyncParts01 & ~mask;
2302 }
2303 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2304 {
2305 offset = ( part_id % 32 );
2306 mask = 1 << offset;
2307
2308 m_SyncParts02 = m_SyncParts02 & ~mask;
2309 }
2310 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2311 {
2312 offset = ( part_id % 63 );
2313 mask = 1 << offset;
2314
2315 m_SyncParts03 = m_SyncParts03 & ~mask;
2316 }
2317 }
2318
2319 bool IsPartBuildInSyncData( int part_id )
2320 {
2321 //part_id must starts from index = 1
2322 int offset;
2323 int mask;
2324
2325 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
2326 {
2327 offset = part_id - 1;
2328 mask = 1 << offset;
2329
2330 if ( ( m_SyncParts01 & mask ) > 0 )
2331 {
2332 return true;
2333 }
2334 }
2335 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
2336 {
2337 offset = ( part_id % 32 );
2338 mask = 1 << offset;
2339
2340 if ( ( m_SyncParts02 & mask ) > 0 )
2341 {
2342 return true;
2343 }
2344 }
2345 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
2346 {
2347 offset = ( part_id % 63 );
2348 mask = 1 << offset;
2349
2350 if ( ( m_SyncParts03 & mask ) > 0 )
2351 {
2352 return true;
2353 }
2354 }
2355
2356 return false;
2357 }
2358
2359 protected void RegisterActionForSync( int part_id, int action_id )
2360 {
2361 m_InteractedPartId = part_id;
2362 m_PerformedActionId = action_id;
2363 }
2364
2365 protected void ResetActionSyncData()
2366 {
2367 //reset data
2368 m_InteractedPartId = -1;
2370 }
2371
2372 protected void SetActionFromSyncData()
2373 {
2374 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
2375 {
2377 int build_action_id = m_PerformedActionId;
2378
2379 switch( build_action_id )
2380 {
2381 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
2382 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
2383 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
2384 }
2385 }
2386 }
2387 //------
2388
2390 {
2391 string key = part.m_PartName;
2392 bool is_base = part.IsBase();
2393 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
2394 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
2395 if ( is_part_built_sync )
2396 {
2397 if ( !part.IsBuilt() )
2398 {
2399 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
2400 GetConstruction().AddToConstructedParts( key );
2401 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
2402
2403 if (is_base)
2404 {
2406 RemoveProxyPhysics( ANIMATION_DEPLOYED );
2407 }
2408 }
2409 }
2410 else
2411 {
2412 if ( part.IsBuilt() )
2413 {
2414 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
2415 GetConstruction().RemoveFromConstructedParts( key );
2416 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
2417
2418 if (is_base)
2419 {
2421 AddProxyPhysics( ANIMATION_DEPLOYED );
2422 }
2423 }
2424 }
2425
2426 //check slot lock for material attachments
2427 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
2428 }
2429
2430 //set construction parts based on synchronized data
2432 {
2433 Construction construction = GetConstruction();
2434 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2435
2436 for ( int i = 0; i < construction_parts.Count(); ++i )
2437 {
2438 string key = construction_parts.GetKey( i );
2439 ConstructionPart value = construction_parts.Get( key );
2440 SetPartFromSyncData(value);
2441 }
2442
2443 //regenerate navmesh
2444 UpdateNavmesh();
2445 }
2446
2447 protected ConstructionPart GetConstructionPartById( int id )
2448 {
2449 Construction construction = GetConstruction();
2450 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
2451
2452 for ( int i = 0; i < construction_parts.Count(); ++i )
2453 {
2454 string key = construction_parts.GetKey( i );
2455 ConstructionPart value = construction_parts.Get( key );
2456
2457 if ( value.GetId() == id )
2458 {
2459 return value;
2460 }
2461 }
2462
2463 return NULL;
2464 }
2465 //
2466
2467 //Base
2468 bool HasBase()
2469 {
2470 return m_HasBase;
2471 }
2472
2473 void SetBaseState( bool has_base )
2474 {
2475 m_HasBase = has_base;
2476 }
2477
2478 override bool IsDeployable()
2479 {
2480 return true;
2481 }
2482
2483 bool IsOpened()
2484 {
2485 return false;
2486 }
2487
2488 //--- CONSTRUCTION KIT
2490 {
2491 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
2492 if ( m_ConstructionKitHealth > 0 )
2493 {
2494 construction_kit.SetHealth( m_ConstructionKitHealth );
2495 }
2496
2497 return construction_kit;
2498 }
2499
2500 void CreateConstructionKitInHands(notnull PlayerBase player)
2501 {
2502 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2503 if ( m_ConstructionKitHealth > 0 )
2504 {
2505 construction_kit.SetHealth( m_ConstructionKitHealth );
2506 }
2507 }
2508
2509 protected vector GetKitSpawnPosition()
2510 {
2511 return GetPosition();
2512 }
2513
2514 protected string GetConstructionKitType()
2515 {
2516 return "";
2517 }
2518
2519 void DestroyConstructionKit( ItemBase construction_kit )
2520 {
2521 m_ConstructionKitHealth = construction_kit.GetHealth();
2522 GetGame().ObjectDelete( construction_kit );
2523 }
2524
2525 //--- CONSTRUCTION
2526 void DestroyConstruction()
2527 {
2528 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2529 GetGame().ObjectDelete( this );
2530 }
2531
2532 // --- EVENTS
2533 override void OnStoreSave( ParamsWriteContext ctx )
2534 {
2535 super.OnStoreSave( ctx );
2536
2537 //sync parts 01
2538 ctx.Write( m_SyncParts01 );
2539 ctx.Write( m_SyncParts02 );
2540 ctx.Write( m_SyncParts03 );
2541
2542 ctx.Write( m_HasBase );
2543 }
2544
2545 override bool OnStoreLoad( ParamsReadContext ctx, int version )
2546 {
2547 if ( !super.OnStoreLoad( ctx, version ) )
2548 return false;
2549
2550 //--- Base building data ---
2551 //Restore synced parts data
2552 if ( !ctx.Read( m_SyncParts01 ) )
2553 {
2554 m_SyncParts01 = 0; //set default
2555 return false;
2556 }
2557 if ( !ctx.Read( m_SyncParts02 ) )
2558 {
2559 m_SyncParts02 = 0; //set default
2560 return false;
2561 }
2562 if ( !ctx.Read( m_SyncParts03 ) )
2563 {
2564 m_SyncParts03 = 0; //set default
2565 return false;
2566 }
2567
2568 //has base
2569 if ( !ctx.Read( m_HasBase ) )
2570 {
2571 m_HasBase = false;
2572 return false;
2573 }
2574 //---
2575
2576 return true;
2577 }
2578
2579 override void AfterStoreLoad()
2580 {
2581 super.AfterStoreLoad();
2582
2584 {
2586 }
2587 }
2588
2590 {
2591 //update server data
2593
2594 //set base state
2595 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
2596 SetBaseState( construction_part.IsBuilt() ) ;
2597
2598 //synchronize after load
2600 }
2601
2602 override void OnCreatePhysics()
2603 {
2604 super.OnCreatePhysics();
2607 }
2608
2609 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2610 {
2612 return;
2613
2614 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2615
2616 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
2617 return;
2618
2619 Construction construction = GetConstruction();
2620 string part_name = zone;
2621 part_name.ToLower();
2622
2623 if ( newLevel == GameConstants.STATE_RUINED )
2624 {
2625 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2626
2627 if ( construction_part && construction.IsPartConstructed( part_name ) )
2628 {
2629 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
2630 construction.DestroyConnectedParts(part_name);
2631 }
2632
2633 //barbed wire handling (hack-ish)
2634 if ( part_name.Contains("barbed") )
2635 {
2636 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2637 if (barbed_wire)
2638 barbed_wire.SetMountedState( false );
2639 }
2640 }
2641 }
2642
2643 override void EEOnAfterLoad()
2644 {
2646 {
2648 }
2649
2650 super.EEOnAfterLoad();
2651 }
2652
2653 override void EEInit()
2654 {
2655 super.EEInit();
2656
2657 // init visuals and physics
2658 InitBaseState();
2659
2660 //debug
2661 #ifdef DEVELOPER
2663 #endif
2664 }
2665
2666 override void EEItemAttached( EntityAI item, string slot_name )
2667 {
2668 super.EEItemAttached( item, slot_name );
2669
2670 CheckForHybridAttachments( item, slot_name );
2671 UpdateVisuals();
2672 UpdateAttachmentPhysics( slot_name, false );
2673 }
2674
2675 override void EEItemDetached( EntityAI item, string slot_name )
2676 {
2677 super.EEItemDetached( item, slot_name );
2678
2679 UpdateVisuals();
2680 UpdateAttachmentPhysics( slot_name, false );
2681 }
2682
2683 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
2684 {
2685 string slot_name = InventorySlots.GetSlotName( slotId );
2686 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
2687
2688 UpdateAttachmentVisuals( slot_name, locked );
2689 UpdateAttachmentPhysics( slot_name, locked );
2690 }
2691
2692 //ignore out of reach condition
2693 override bool IgnoreOutOfReachCondition()
2694 {
2695 return true;
2696 }
2697
2698 //CONSTRUCTION EVENTS
2699 //Build
2700 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
2701 {
2702 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2703
2704 //check base state
2705 if (construtionPart.IsBase())
2706 {
2707 SetBaseState(true);
2708
2709 //spawn kit
2711 }
2712
2713 //register constructed parts for synchronization
2714 RegisterPartForSync(construtionPart.GetId());
2715
2716 //register action that was performed on part
2717 RegisterActionForSync(construtionPart.GetId(), action_id);
2718
2719 //synchronize
2721
2722 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
2723
2724 UpdateNavmesh();
2725
2726 //update visuals
2727 UpdateVisuals();
2728
2729 //reset action sync data
2731 }
2732
2733 void OnPartBuiltClient(string part_name, int action_id)
2734 {
2735 //play sound
2736 SoundBuildStart( part_name );
2737 }
2738
2739 //Dismantle
2740 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
2741 {
2742 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
2743 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2744
2745 //register constructed parts for synchronization
2746 UnregisterPartForSync(construtionPart.GetId());
2747
2748 //register action that was performed on part
2749 RegisterActionForSync(construtionPart.GetId(), action_id);
2750
2751 //synchronize
2753
2754 // server part of sync, client will be synced from SetPartsFromSyncData
2755 SetPartFromSyncData(construtionPart);
2756
2757 UpdateNavmesh();
2758
2759 //update visuals
2760 UpdateVisuals();
2761
2762 //reset action sync data
2764
2765 //check base state
2766 if (construtionPart.IsBase())
2767 {
2768 //Destroy construction
2770 }
2771 }
2772
2773 void OnPartDismantledClient( string part_name, int action_id )
2774 {
2775 //play sound
2776 SoundDismantleStart( part_name );
2777 }
2778
2779 //Destroy
2780 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
2781 {
2782 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
2783 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2784
2785 //register constructed parts for synchronization
2786 UnregisterPartForSync(construtionPart.GetId());
2787
2788 //register action that was performed on part
2789 RegisterActionForSync(construtionPart.GetId(), action_id);
2790
2791 //synchronize
2793
2794 // server part of sync, client will be synced from SetPartsFromSyncData
2795 SetPartFromSyncData(construtionPart);
2796
2797 UpdateNavmesh();
2798
2799 //update visuals
2800 UpdateVisuals();
2801
2802 //reset action sync data
2804
2805 //check base state
2806 if (construtionPart.IsBase())
2807 {
2808 //Destroy construction
2810 }
2811 }
2812
2813 void OnPartDestroyedClient( string part_name, int action_id )
2814 {
2815 //play sound
2816 SoundDestroyStart( part_name );
2817 }
2818
2820 protected void HandleItemFalling(ConstructionPart part)
2821 {
2822 bool process = false;
2823
2824 //TODO: add a parameter to parts' config classes?
2825 process |= part.m_PartName.Contains("_roof");
2826 process |= part.m_PartName.Contains("_platform");
2827 process |= part.m_PartName.Contains("_stair");
2828
2829 if (process)
2830 {
2831 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
2832 {
2833 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
2834 return;
2835 }
2836
2837 vector mins, maxs;
2838 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
2839 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
2840
2841 //sanitize minmaxs
2842 vector minTmp, maxTmp;
2843 minTmp[0] = Math.Min(mins[0],maxs[0]);
2844 maxTmp[0] = Math.Max(mins[0],maxs[0]);
2845 minTmp[1] = Math.Min(mins[1],maxs[1]);
2846 maxTmp[1] = Math.Max(mins[1],maxs[1]);
2847 minTmp[2] = Math.Min(mins[2],maxs[2]);
2848 maxTmp[2] = Math.Max(mins[2],maxs[2]);
2849 mins = minTmp;
2850 maxs = maxTmp;
2851
2852 maxs[1] = maxs[1] + 0.35; //reach a little above..
2853
2854 ItemFall(mins,maxs);
2855 }
2856 }
2857
2859 protected void ItemFall(vector min, vector max)
2860 {
2861 array<EntityAI> foundEntities = new array<EntityAI>();
2862 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
2863
2864 //filtering
2865 ItemBase item;
2866 foreach (EntityAI entity : foundEntities)
2867 {
2868 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
2869 item.ThrowPhysically(null,vector.Zero);
2870 }
2871 }
2872
2873 // --- UPDATE
2874 void InitBaseState()
2875 {
2876 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
2877
2878 InitVisuals();
2879 UpdateNavmesh(); //regenerate navmesh
2880 GetConstruction().InitBaseState();
2881 }
2882
2883 void InitVisuals()
2884 {
2885 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
2886 //check base
2887 if ( !HasBase() )
2888 {
2889 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
2890 }
2891 else
2892 {
2893 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
2894 }
2895
2896 GetConstruction().UpdateVisuals();
2897 }
2898
2899 void UpdateVisuals()
2900 {
2901 array<string> attachmentSlots = new array<string>;
2902
2903 GetAttachmentSlots(this, attachmentSlots);
2904 foreach (string slotName : attachmentSlots)
2905 {
2907 }
2908
2909 //check base
2910 if (!HasBase())
2911 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
2912 else
2913 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
2914
2915 GetConstruction().UpdateVisuals();
2916 }
2917
2918 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
2919 {
2920 string slotNameMounted = slot_name + "_Mounted";
2921 EntityAI attachment = FindAttachmentBySlotName(slot_name);
2922
2923 if (attachment)
2924 {
2925 BarbedWire barbedWire = BarbedWire.Cast(attachment);
2926 if (barbedWire && barbedWire.IsMounted())
2927 CreateAreaDamage(slotNameMounted);
2928 else
2929 DestroyAreaDamage(slotNameMounted);
2930
2931 if (is_locked)
2932 {
2933 SetAnimationPhase(slotNameMounted, 0);
2934 SetAnimationPhase(slot_name, 1);
2935 }
2936 else
2937 {
2938 SetAnimationPhase(slotNameMounted, 1);
2939 SetAnimationPhase(slot_name, 0);
2940 }
2941 }
2942 else
2943 {
2944 SetAnimationPhase(slotNameMounted, 1);
2945 SetAnimationPhase(slot_name, 1);
2946
2947 DestroyAreaDamage(slotNameMounted);
2948 }
2949 }
2950
2951 // avoid calling this function on frequent occasions, it's a massive performance hit
2952 void UpdatePhysics()
2953 {
2955 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
2956
2957 array<string> attachmentSlots = new array<string>;
2958 GetAttachmentSlots(this, attachmentSlots);
2959
2961 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
2962
2963 foreach (string slotName : attachmentSlots)
2964 {
2966 }
2967
2968 //check base
2969 if (!HasBase())
2970 {
2972 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
2973
2974 AddProxyPhysics(ANIMATION_DEPLOYED);
2975 }
2976 else
2977 {
2979 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
2980
2981 RemoveProxyPhysics(ANIMATION_DEPLOYED);
2982 }
2983
2984 GetConstruction().UpdatePhysics();
2985 UpdateNavmesh();
2986 }
2987
2988 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
2989 {
2990 //checks for invalid appends; hotfix
2991 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
2992 return;
2993 //----------------------------------
2994 string slot_name_mounted = slot_name + "_Mounted";
2995 EntityAI attachment = FindAttachmentBySlotName( slot_name );
2996
2997 //remove proxy physics
2998 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
2999 RemoveProxyPhysics( slot_name_mounted );
3000 RemoveProxyPhysics( slot_name );
3001
3002 if ( attachment )
3003 {
3004 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
3005 if ( is_locked )
3006 {
3007 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
3008 AddProxyPhysics( slot_name_mounted );
3009 }
3010 else
3011 {
3012 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
3013 AddProxyPhysics( slot_name );
3014 }
3015 }
3016 }
3017
3018 protected void UpdateNavmesh()
3019 {
3020 SetAffectPathgraph( true, false );
3021 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
3022 }
3023
3024 override bool CanUseConstruction()
3025 {
3026 return true;
3027 }
3028
3029 override bool CanUseConstructionBuild()
3030 {
3031 return true;
3032 }
3033
3034 protected bool IsAttachmentSlotLocked( EntityAI attachment )
3035 {
3036 if ( attachment )
3037 {
3038 InventoryLocation inventory_location = new InventoryLocation;
3039 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3040
3041 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
3042 }
3043
3044 return false;
3045 }
3046
3047 protected bool IsAttachmentSlotLocked( string slot_name )
3048 {
3049 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
3050 }
3051
3052 //--- ATTACHMENT SLOTS
3053 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
3054 {
3055 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3056 if ( GetGame().ConfigIsExisting( config_path ) )
3057 {
3058 GetGame().ConfigGetTextArray( config_path, attachment_slots );
3059 }
3060 }
3061
3062 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
3063 {
3064 return true;
3065 }
3066
3067 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
3068 {
3069 return true;
3070 }
3071
3072 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
3073 {
3074 return true;
3075 }
3076
3077 // --- INIT
3078 void ConstructionInit()
3079 {
3080 if ( !m_Construction )
3081 {
3082 m_Construction = new Construction( this );
3083 }
3084
3085 GetConstruction().Init();
3086 }
3087
3089 {
3090 return m_Construction;
3091 }
3092
3093 //--- INVENTORY/ATTACHMENTS CONDITIONS
3094 //attachments
3095 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
3096 {
3097 return super.CanReceiveAttachment(attachment, slotId);
3098 }
3099
3101 {
3102 int attachment_count = GetInventory().AttachmentCount();
3103 if ( attachment_count > 0 )
3104 {
3105 if ( HasBase() && attachment_count == 1 )
3106 {
3107 return false;
3108 }
3109
3110 return true;
3111 }
3112
3113 return false;
3114 }
3115
3116 override bool ShowZonesHealth()
3117 {
3118 return true;
3119 }
3120
3121 override bool IsTakeable()
3122 {
3123 return false;
3124 }
3125
3126 //this into/outo parent.Cargo
3127 override bool CanPutInCargo( EntityAI parent )
3128 {
3129 return false;
3130 }
3131
3132 override bool CanRemoveFromCargo( EntityAI parent )
3133 {
3134 return false;
3135 }
3136
3137 //hands
3138 override bool CanPutIntoHands( EntityAI parent )
3139 {
3140 return false;
3141 }
3142
3143 //--- ACTION CONDITIONS
3144 //direction
3145 override bool IsFacingPlayer( PlayerBase player, string selection )
3146 {
3147 return true;
3148 }
3149
3150 override bool IsPlayerInside( PlayerBase player, string selection )
3151 {
3152 return true;
3153 }
3154
3157 {
3158 return false;
3159 }
3160
3161 //camera direction check
3162 bool IsFacingCamera( string selection )
3163 {
3164 return true;
3165 }
3166
3167 //roof check
3168 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
3169 {
3170 return false;
3171 }
3172
3173 //selection->player distance check
3174 bool HasProperDistance( string selection, PlayerBase player )
3175 {
3176 return true;
3177 }
3178
3179 //folding
3181 {
3182 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
3183 {
3184 return false;
3185 }
3186
3187 return true;
3188 }
3189
3191 {
3194
3195 return item;
3196 }
3197
3198 //Damage triggers (barbed wire)
3199 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
3200 {
3201 if ( GetGame() && GetGame().IsServer() )
3202 {
3203 //destroy area damage if some already exists
3204 DestroyAreaDamage( slot_name );
3205
3206 //create new area damage
3208 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
3209
3210 vector min_max[2];
3211 if ( MemoryPointExists( slot_name + "_min" ) )
3212 {
3213 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3214 }
3215 if ( MemoryPointExists( slot_name + "_max" ) )
3216 {
3217 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3218 }
3219
3220 //get proper trigger extents (min<max)
3221 vector extents[2];
3222 GetConstruction().GetTriggerExtents( min_max, extents );
3223
3224 //get box center
3225 vector center;
3226 center = GetConstruction().GetBoxCenter( min_max );
3227 center = ModelToWorld( center );
3228
3229 //rotate center if needed
3230 vector orientation = GetOrientation();;
3231 CalcDamageAreaRotation( rotation_angle, center, orientation );
3232
3233 areaDamage.SetExtents( extents[0], extents[1] );
3234 areaDamage.SetAreaPosition( center );
3235 areaDamage.SetAreaOrientation( orientation );
3236 areaDamage.SetLoopInterval( 1.0 );
3237 areaDamage.SetDeferDuration( 0.2 );
3238 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3239 areaDamage.SetAmmoName( "BarbedWireHit" );
3240 areaDamage.Spawn();
3241
3242 m_DamageTriggers.Insert( slot_name, areaDamage );
3243 }
3244 }
3245
3246 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
3247 {
3248 if ( angle_deg != 0 )
3249 {
3250 //orientation
3251 orientation[0] = orientation[0] - angle_deg;
3252
3253 //center
3254 vector rotate_axis;
3255 if ( MemoryPointExists( "rotate_axis" ) )
3256 {
3257 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3258 }
3259 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];
3260 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];
3261 center[0] = r_center_x;
3262 center[2] = r_center_z;
3263 }
3264 }
3265
3266 void DestroyAreaDamage( string slot_name )
3267 {
3268 if (GetGame() && GetGame().IsServer())
3269 {
3271 if (m_DamageTriggers.Find(slot_name, areaDamage))
3272 {
3273 if (areaDamage)
3274 {
3275 areaDamage.Destroy();
3276 }
3277
3278 m_DamageTriggers.Remove( slot_name );
3279 }
3280 }
3281 }
3282
3283 override bool IsIgnoredByConstruction()
3284 {
3285 return true;
3286 }
3287
3288 //================================================================
3289 // SOUNDS
3290 //================================================================
3291 protected void SoundBuildStart( string part_name )
3292 {
3293 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
3294 }
3295
3296 protected void SoundDismantleStart( string part_name )
3297 {
3298 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3299 }
3300
3301 protected void SoundDestroyStart( string part_name )
3302 {
3303 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
3304 }
3305
3306 protected string GetBuildSoundByMaterial( string part_name )
3307 {
3308 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3309
3310 switch ( material_type )
3311 {
3312 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
3313 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
3314 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
3315 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
3316 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
3317 }
3318
3319 return "";
3320 }
3321
3322 protected string GetDismantleSoundByMaterial( string part_name )
3323 {
3324 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
3325
3326 switch ( material_type )
3327 {
3328 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
3329 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
3330 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
3331 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
3332 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
3333 }
3334
3335 return "";
3336 }
3337
3338 //misc
3339 void CheckForHybridAttachments( EntityAI item, string slot_name )
3340 {
3341 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
3342 {
3343 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
3344 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
3345 {
3346 SetHealth(slot_name,"Health",item.GetHealth());
3347 }
3348 }
3349 }
3350
3351 override int GetDamageSystemVersionChange()
3352 {
3353 return 111;
3354 }
3355
3356 override void SetActions()
3357 {
3358 super.SetActions();
3359
3363 }
3364
3365 //================================================================
3366 // DEBUG
3367 //================================================================
3368 protected void DebugCustomState()
3369 {
3370 }
3371
3374 {
3375 return null;
3376 }
3377
3378 override void OnDebugSpawn()
3379 {
3380 FullyBuild();
3381 }
3382
3383 void FullyBuild()
3384 {
3386 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
3387
3388 Man p;
3389
3390 #ifdef SERVER
3391 array<Man> players = new array<Man>;
3392 GetGame().GetWorld().GetPlayerList(players);
3393 if (players.Count())
3394 p = players[0];
3395 #else
3396 p = GetGame().GetPlayer();
3397 #endif
3398
3399 foreach (ConstructionPart part : parts)
3400 {
3401 bool excluded = false;
3402 string partName = part.GetPartName();
3403 if (excludes)
3404 {
3405 foreach (string exclude : excludes)
3406 {
3407 if (partName.Contains(exclude))
3408 {
3409 excluded = true;
3410 break;
3411 }
3412 }
3413 }
3414
3415 if (!excluded)
3416 {
3417 OnPartBuiltServer(p, partName, AT_BUILD_PART);
3418 }
3419 }
3420
3421 GetConstruction().UpdateVisuals();
3422 }
3423}
3424
3425void bsbDebugPrint (string s)
3426{
3427#ifdef BSB_DEBUG
3428 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3429#else
3430 //Print("" + s); // comment/uncomment to hide/see debug logs
3431#endif
3432}
3433void bsbDebugSpam (string s)
3434{
3435#ifdef BSB_DEBUG_SPAM
3436 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
3437#else
3438 //Print("" + s); // comment/uncomment to hide/see debug logs
3439#endif
3440}
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

Используется в ItemBase::OnSetSlotLock() и ItemBase::UpdateVisuals().