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

◆ AfterStoreLoad()

override void bsbDebugPrint::AfterStoreLoad ( )
protected

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

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