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

◆ EEOnAfterLoad()

override void bsbDebugPrint::EEOnAfterLoad ( )
protected

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

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