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

◆ OnStoreLoad()

override bool bsbDebugPrint::OnStoreLoad ( ParamsReadContext ctx,
int version )
protected

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

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