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

◆ OnPartDismantledClient()

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

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

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

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