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

◆ SetPartsAfterStoreLoad()

void bsbDebugPrint::SetPartsAfterStoreLoad ( )
protected

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

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

Используется в ItemBase::AfterStoreLoad() и ItemBase::OnCreatePhysics().