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

◆ OnPartDestroyedClient()

void bsbDebugPrint::OnPartDestroyedClient ( string part_name,
int action_id )
protected

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

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