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

◆ OnCreatePhysics()

override void bsbDebugPrint::OnCreatePhysics ( )
protected

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

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