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

◆ AfterStoreLoad()

override void bsbDebugPrint::AfterStoreLoad ( )
protected

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

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