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

◆ EEHealthLevelChanged()

override void bsbDebugPrint::EEHealthLevelChanged ( int oldLevel,
int newLevel,
string zone )
protected

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

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