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

◆ OnStoreSave()

override void bsbDebugPrint::OnStoreSave ( ParamsWriteContext ctx)
protected

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

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