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

◆ HasBase()

bool bsbDebugPrint::HasBase ( )
protected

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

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

Используется в BaseBuildingBase::CanDisplayAttachmentCategory(), ItemBase::CanFoldBaseBuildingObject(), BaseBuildingBase::CanPutIntoHands(), BaseBuildingBase::CanReceiveAttachment(), ItemBase::HasAttachmentsBesidesBase(), ItemBase::InitVisuals(), ItemBase::UpdatePhysics() и ItemBase::UpdateVisuals().