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

◆ ItemFall()

void bsbDebugPrint::ItemFall ( vector min,
vector max )
protected

Disconnected temporarily.

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

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