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

◆ OnPartBuiltClient()

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

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

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