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

◆ OnSetSlotLock()

void bsbDebugPrint::OnSetSlotLock ( int slotId,
bool locked,
bool was_locked )
protected

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

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