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

◆ OnCreatePhysics()

override void bsbDebugPrint::OnCreatePhysics ( )
protected

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

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