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

◆ EEOnAfterLoad()

override void bsbDebugPrint::EEOnAfterLoad ( )
protected

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

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