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

◆ OnPartBuiltServer()

void bsbDebugPrint::OnPartBuiltServer ( notnull Man player,
string part_name,
int action_id )
protected

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

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