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

◆ EEItemAttached()

override void bsbDebugPrint::EEItemAttached ( EntityAI item,
string slot_name )
protected

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

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