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

◆ CreateConstructionKit()

ItemBase bsbDebugPrint::CreateConstructionKit ( )
protected

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

1643{
1644 const string ANIMATION_DEPLOYED = "Deployed";
1645
1646 float m_ConstructionKitHealth; //stored health value for used construction kit
1647
1649
1650 bool m_HasBase;
1651 //variables for synchronization of base building parts (2x31 is the current limit)
1652 int m_SyncParts01; //synchronization for already built parts (31 parts)
1653 int m_SyncParts02; //synchronization for already built parts (+31 parts)
1654 int m_SyncParts03; //synchronization for already built parts (+31 parts)
1655 int m_InteractedPartId; //construction part id that an action was performed on
1656 int m_PerformedActionId; //action id that was performed on a construction part
1657
1658 //Sounds
1659 //build
1660 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
1661 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
1662 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
1663 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
1664 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
1665 //dismantle
1666 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
1667 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
1668 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
1669 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
1670 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
1671
1672 protected EffectSound m_Sound;
1673
1677
1678 // Constructor
1679 void BaseBuildingBase()
1680 {
1682
1683 //synchronized variables
1684 RegisterNetSyncVariableInt( "m_SyncParts01" );
1685 RegisterNetSyncVariableInt( "m_SyncParts02" );
1686 RegisterNetSyncVariableInt( "m_SyncParts03" );
1687 RegisterNetSyncVariableInt( "m_InteractedPartId" );
1688 RegisterNetSyncVariableInt( "m_PerformedActionId" );
1689 RegisterNetSyncVariableBool( "m_HasBase" );
1690
1691 //Construction init
1693
1694 if (ConfigIsExisting("hybridAttachments"))
1695 {
1697 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
1698 }
1699 if (ConfigIsExisting("mountables"))
1700 {
1702 ConfigGetTextArray("mountables", m_Mountables);
1703 }
1704
1705 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
1706 }
1707
1708 override void EEDelete(EntityAI parent)
1709 {
1710 super.EEDelete(parent);
1711
1712 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
1713 {
1714 areaDamage.Destroy();
1715 }
1716
1717 }
1718
1719 override string GetInvulnerabilityTypeString()
1720 {
1721 return "disableBaseDamage";
1722 }
1723
1724 override bool CanObstruct()
1725 {
1726 return true;
1727 }
1728
1729 override int GetHideIconMask()
1730 {
1731 return EInventoryIconVisibility.HIDE_VICINITY;
1732 }
1733
1734 // --- SYNCHRONIZATION
1736 {
1737 if ( GetGame().IsServer() )
1738 {
1739 SetSynchDirty();
1740 }
1741 }
1742
1743 override void OnVariablesSynchronized()
1744 {
1745 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
1746 super.OnVariablesSynchronized();
1747
1749 }
1750
1751 protected void OnSynchronizedClient()
1752 {
1753 //update parts
1755
1756 //update action on part
1758
1759 //update visuals (client)
1760 UpdateVisuals();
1761 }
1762
1763 //parts synchronization
1764 void RegisterPartForSync( int part_id )
1765 {
1766 //part_id must starts from index = 1
1767 int offset;
1768 int mask;
1769
1770 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
1771 {
1772 offset = part_id - 1;
1773 mask = 1 << offset;
1774
1775 m_SyncParts01 = m_SyncParts01 | mask;
1776 }
1777 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
1778 {
1779 offset = ( part_id % 32 );
1780 mask = 1 << offset;
1781
1782 m_SyncParts02 = m_SyncParts02 | mask;
1783 }
1784 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
1785 {
1786 offset = ( part_id % 63 );
1787 mask = 1 << offset;
1788
1789 m_SyncParts03 = m_SyncParts03 | mask;
1790 }
1791 }
1792
1793 void UnregisterPartForSync( int part_id )
1794 {
1795 //part_id must starts from index = 1
1796 int offset;
1797 int mask;
1798
1799 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
1800 {
1801 offset = part_id - 1;
1802 mask = 1 << offset;
1803
1804 m_SyncParts01 = m_SyncParts01 & ~mask;
1805 }
1806 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
1807 {
1808 offset = ( part_id % 32 );
1809 mask = 1 << offset;
1810
1811 m_SyncParts02 = m_SyncParts02 & ~mask;
1812 }
1813 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
1814 {
1815 offset = ( part_id % 63 );
1816 mask = 1 << offset;
1817
1818 m_SyncParts03 = m_SyncParts03 & ~mask;
1819 }
1820 }
1821
1822 bool IsPartBuildInSyncData( int part_id )
1823 {
1824 //part_id must starts from index = 1
1825 int offset;
1826 int mask;
1827
1828 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
1829 {
1830 offset = part_id - 1;
1831 mask = 1 << offset;
1832
1833 if ( ( m_SyncParts01 & mask ) > 0 )
1834 {
1835 return true;
1836 }
1837 }
1838 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
1839 {
1840 offset = ( part_id % 32 );
1841 mask = 1 << offset;
1842
1843 if ( ( m_SyncParts02 & mask ) > 0 )
1844 {
1845 return true;
1846 }
1847 }
1848 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
1849 {
1850 offset = ( part_id % 63 );
1851 mask = 1 << offset;
1852
1853 if ( ( m_SyncParts03 & mask ) > 0 )
1854 {
1855 return true;
1856 }
1857 }
1858
1859 return false;
1860 }
1861
1862 protected void RegisterActionForSync( int part_id, int action_id )
1863 {
1864 m_InteractedPartId = part_id;
1865 m_PerformedActionId = action_id;
1866 }
1867
1868 protected void ResetActionSyncData()
1869 {
1870 //reset data
1871 m_InteractedPartId = -1;
1873 }
1874
1875 protected void SetActionFromSyncData()
1876 {
1877 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
1878 {
1880 int build_action_id = m_PerformedActionId;
1881
1882 switch( build_action_id )
1883 {
1884 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
1885 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
1886 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
1887 }
1888 }
1889 }
1890 //------
1891
1893 {
1894 string key = part.m_PartName;
1895 bool is_base = part.IsBase();
1896 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
1897 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
1898 if ( is_part_built_sync )
1899 {
1900 if ( !part.IsBuilt() )
1901 {
1902 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
1903 GetConstruction().AddToConstructedParts( key );
1904 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
1905
1906 if (is_base)
1907 {
1909 RemoveProxyPhysics( ANIMATION_DEPLOYED );
1910 }
1911 }
1912 }
1913 else
1914 {
1915 if ( part.IsBuilt() )
1916 {
1917 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
1918 GetConstruction().RemoveFromConstructedParts( key );
1919 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
1920
1921 if (is_base)
1922 {
1924 AddProxyPhysics( ANIMATION_DEPLOYED );
1925 }
1926 }
1927 }
1928
1929 //check slot lock for material attachments
1930 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
1931 }
1932
1933 //set construction parts based on synchronized data
1935 {
1936 Construction construction = GetConstruction();
1937 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
1938
1939 for ( int i = 0; i < construction_parts.Count(); ++i )
1940 {
1941 string key = construction_parts.GetKey( i );
1942 ConstructionPart value = construction_parts.Get( key );
1943 SetPartFromSyncData(value);
1944 }
1945
1946 //regenerate navmesh
1947 UpdateNavmesh();
1948 }
1949
1950 protected ConstructionPart GetConstructionPartById( int id )
1951 {
1952 Construction construction = GetConstruction();
1953 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
1954
1955 for ( int i = 0; i < construction_parts.Count(); ++i )
1956 {
1957 string key = construction_parts.GetKey( i );
1958 ConstructionPart value = construction_parts.Get( key );
1959
1960 if ( value.GetId() == id )
1961 {
1962 return value;
1963 }
1964 }
1965
1966 return NULL;
1967 }
1968 //
1969
1970 //Base
1971 bool HasBase()
1972 {
1973 return m_HasBase;
1974 }
1975
1976 void SetBaseState( bool has_base )
1977 {
1978 m_HasBase = has_base;
1979 }
1980
1981 override bool IsDeployable()
1982 {
1983 return true;
1984 }
1985
1986 bool IsOpened()
1987 {
1988 return false;
1989 }
1990
1991 //--- CONSTRUCTION KIT
1993 {
1994 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
1995 if ( m_ConstructionKitHealth > 0 )
1996 {
1997 construction_kit.SetHealth( m_ConstructionKitHealth );
1998 }
1999
2000 return construction_kit;
2001 }
2002
2003 void CreateConstructionKitInHands(notnull PlayerBase player)
2004 {
2005 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2006 if ( m_ConstructionKitHealth > 0 )
2007 {
2008 construction_kit.SetHealth( m_ConstructionKitHealth );
2009 }
2010 }
2011
2012 protected vector GetKitSpawnPosition()
2013 {
2014 return GetPosition();
2015 }
2016
2017 protected string GetConstructionKitType()
2018 {
2019 return "";
2020 }
2021
2022 void DestroyConstructionKit( ItemBase construction_kit )
2023 {
2024 m_ConstructionKitHealth = construction_kit.GetHealth();
2025 GetGame().ObjectDelete( construction_kit );
2026 }
2027
2028 //--- CONSTRUCTION
2029 void DestroyConstruction()
2030 {
2031 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2032 GetGame().ObjectDelete( this );
2033 }
2034
2035 // --- EVENTS
2036 override void OnStoreSave( ParamsWriteContext ctx )
2037 {
2038 super.OnStoreSave( ctx );
2039
2040 //sync parts 01
2041 ctx.Write( m_SyncParts01 );
2042 ctx.Write( m_SyncParts02 );
2043 ctx.Write( m_SyncParts03 );
2044
2045 ctx.Write( m_HasBase );
2046 }
2047
2048 override bool OnStoreLoad( ParamsReadContext ctx, int version )
2049 {
2050 if ( !super.OnStoreLoad( ctx, version ) )
2051 return false;
2052
2053 //--- Base building data ---
2054 //Restore synced parts data
2055 if ( !ctx.Read( m_SyncParts01 ) )
2056 {
2057 m_SyncParts01 = 0; //set default
2058 return false;
2059 }
2060 if ( !ctx.Read( m_SyncParts02 ) )
2061 {
2062 m_SyncParts02 = 0; //set default
2063 return false;
2064 }
2065 if ( !ctx.Read( m_SyncParts03 ) )
2066 {
2067 m_SyncParts03 = 0; //set default
2068 return false;
2069 }
2070
2071 //has base
2072 if ( !ctx.Read( m_HasBase ) )
2073 {
2074 m_HasBase = false;
2075 return false;
2076 }
2077 //---
2078
2079 return true;
2080 }
2081
2082 override void AfterStoreLoad()
2083 {
2084 super.AfterStoreLoad();
2085
2087 {
2089 }
2090 }
2091
2093 {
2094 //update server data
2096
2097 //set base state
2098 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
2099 SetBaseState( construction_part.IsBuilt() ) ;
2100
2101 //synchronize after load
2103 }
2104
2105 override void OnCreatePhysics()
2106 {
2107 super.OnCreatePhysics();
2110 }
2111
2112 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2113 {
2115 return;
2116
2117 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2118
2119 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
2120 return;
2121
2122 Construction construction = GetConstruction();
2123 string part_name = zone;
2124 part_name.ToLower();
2125
2126 if ( newLevel == GameConstants.STATE_RUINED )
2127 {
2128 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2129
2130 if ( construction_part && construction.IsPartConstructed( part_name ) )
2131 {
2132 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
2133 construction.DestroyConnectedParts(part_name);
2134 }
2135
2136 //barbed wire handling (hack-ish)
2137 if ( part_name.Contains("barbed") )
2138 {
2139 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2140 if (barbed_wire)
2141 barbed_wire.SetMountedState( false );
2142 }
2143 }
2144 }
2145
2146 override void EEOnAfterLoad()
2147 {
2149 {
2151 }
2152
2153 super.EEOnAfterLoad();
2154 }
2155
2156 override void EEInit()
2157 {
2158 super.EEInit();
2159
2160 // init visuals and physics
2161 InitBaseState();
2162
2163 //debug
2164 #ifdef DEVELOPER
2166 #endif
2167 }
2168
2169 override void EEItemAttached( EntityAI item, string slot_name )
2170 {
2171 super.EEItemAttached( item, slot_name );
2172
2173 CheckForHybridAttachments( item, slot_name );
2174 UpdateVisuals();
2175 UpdateAttachmentPhysics( slot_name, false );
2176 }
2177
2178 override void EEItemDetached( EntityAI item, string slot_name )
2179 {
2180 super.EEItemDetached( item, slot_name );
2181
2182 UpdateVisuals();
2183 UpdateAttachmentPhysics( slot_name, false );
2184 }
2185
2186 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
2187 {
2188 string slot_name = InventorySlots.GetSlotName( slotId );
2189 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
2190
2191 UpdateAttachmentVisuals( slot_name, locked );
2192 UpdateAttachmentPhysics( slot_name, locked );
2193 }
2194
2195 //ignore out of reach condition
2196 override bool IgnoreOutOfReachCondition()
2197 {
2198 return true;
2199 }
2200
2201 //CONSTRUCTION EVENTS
2202 //Build
2203 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
2204 {
2205 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2206
2207 //check base state
2208 if (construtionPart.IsBase())
2209 {
2210 SetBaseState(true);
2211
2212 //spawn kit
2214 }
2215
2216 //register constructed parts for synchronization
2217 RegisterPartForSync(construtionPart.GetId());
2218
2219 //register action that was performed on part
2220 RegisterActionForSync(construtionPart.GetId(), action_id);
2221
2222 //synchronize
2224
2225 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
2226
2227 UpdateNavmesh();
2228
2229 //update visuals
2230 UpdateVisuals();
2231
2232 //reset action sync data
2234 }
2235
2236 void OnPartBuiltClient(string part_name, int action_id)
2237 {
2238 //play sound
2239 SoundBuildStart( part_name );
2240 }
2241
2242 //Dismantle
2243 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
2244 {
2245 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
2246 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2247
2248 //register constructed parts for synchronization
2249 UnregisterPartForSync(construtionPart.GetId());
2250
2251 //register action that was performed on part
2252 RegisterActionForSync(construtionPart.GetId(), action_id);
2253
2254 //synchronize
2256
2257 // server part of sync, client will be synced from SetPartsFromSyncData
2258 SetPartFromSyncData(construtionPart);
2259
2260 UpdateNavmesh();
2261
2262 //update visuals
2263 UpdateVisuals();
2264
2265 //reset action sync data
2267
2268 //check base state
2269 if (construtionPart.IsBase())
2270 {
2271 //Destroy construction
2273 }
2274
2275 if (GetGame().IsServer())
2276 HandleItemFalling(construtionPart);
2277 }
2278
2279 void OnPartDismantledClient( string part_name, int action_id )
2280 {
2281 //play sound
2282 SoundDismantleStart( part_name );
2283 }
2284
2285 //Destroy
2286 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
2287 {
2288 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
2289 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2290
2291 //register constructed parts for synchronization
2292 UnregisterPartForSync(construtionPart.GetId());
2293
2294 //register action that was performed on part
2295 RegisterActionForSync(construtionPart.GetId(), action_id);
2296
2297 //synchronize
2299
2300 // server part of sync, client will be synced from SetPartsFromSyncData
2301 SetPartFromSyncData(construtionPart);
2302
2303 UpdateNavmesh();
2304
2305 //update visuals
2306 UpdateVisuals();
2307
2308 //reset action sync data
2310
2311 //check base state
2312 if (construtionPart.IsBase())
2313 {
2314 //Destroy construction
2316 }
2317
2318 if (GetGame().IsServer())
2319 HandleItemFalling(construtionPart);
2320 }
2321
2322 void OnPartDestroyedClient( string part_name, int action_id )
2323 {
2324 //play sound
2325 SoundDestroyStart( part_name );
2326 }
2327
2328 protected void HandleItemFalling(ConstructionPart part)
2329 {
2330 bool process = false;
2331
2332 //TODO: add a parameter to parts' config classes?
2333 process |= part.m_PartName.Contains("_roof");
2334 process |= part.m_PartName.Contains("_platform");
2335 process |= part.m_PartName.Contains("_stair");
2336
2337 if (process)
2338 {
2339 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
2340 {
2341 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
2342 return;
2343 }
2344
2345 vector mins, maxs;
2346 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
2347 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
2348
2349 //sanitize minmaxs
2350 vector minTmp, maxTmp;
2351 minTmp[0] = Math.Min(mins[0],maxs[0]);
2352 maxTmp[0] = Math.Max(mins[0],maxs[0]);
2353 minTmp[1] = Math.Min(mins[1],maxs[1]);
2354 maxTmp[1] = Math.Max(mins[1],maxs[1]);
2355 minTmp[2] = Math.Min(mins[2],maxs[2]);
2356 maxTmp[2] = Math.Max(mins[2],maxs[2]);
2357 mins = minTmp;
2358 maxs = maxTmp;
2359
2360 maxs[1] = maxs[1] + 0.35; //reach a little above..
2361
2362 ItemFall(mins,maxs);
2363 }
2364 }
2365
2366 protected void ItemFall(vector min, vector max)
2367 {
2368 array<EntityAI> foundEntities = new array<EntityAI>();
2369 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
2370
2371 //filtering
2372 ItemBase item;
2373 foreach (EntityAI entity : foundEntities)
2374 {
2375 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
2376 item.ThrowPhysically(null,vector.Zero);
2377 }
2378 }
2379
2380 // --- UPDATE
2381 void InitBaseState()
2382 {
2383 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
2384
2385 InitVisuals();
2386 UpdateNavmesh(); //regenerate navmesh
2387 GetConstruction().InitBaseState();
2388 }
2389
2390 void InitVisuals()
2391 {
2392 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
2393 //check base
2394 if ( !HasBase() )
2395 {
2396 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
2397 }
2398 else
2399 {
2400 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
2401 }
2402
2403 GetConstruction().UpdateVisuals();
2404 }
2405
2406 void UpdateVisuals()
2407 {
2408 array<string> attachmentSlots = new array<string>;
2409
2410 GetAttachmentSlots(this, attachmentSlots);
2411 foreach (string slotName : attachmentSlots)
2412 {
2414 }
2415
2416 //check base
2417 if (!HasBase())
2418 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
2419 else
2420 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
2421
2422 GetConstruction().UpdateVisuals();
2423 }
2424
2425 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
2426 {
2427 string slotNameMounted = slot_name + "_Mounted";
2428 EntityAI attachment = FindAttachmentBySlotName(slot_name);
2429
2430 if (attachment)
2431 {
2432 BarbedWire barbedWire = BarbedWire.Cast(attachment);
2433 if (barbedWire && barbedWire.IsMounted())
2434 CreateAreaDamage(slotNameMounted);
2435 else
2436 DestroyAreaDamage(slotNameMounted);
2437
2438 if (is_locked)
2439 {
2440 SetAnimationPhase(slotNameMounted, 0);
2441 SetAnimationPhase(slot_name, 1);
2442 }
2443 else
2444 {
2445 SetAnimationPhase(slotNameMounted, 1);
2446 SetAnimationPhase(slot_name, 0);
2447 }
2448 }
2449 else
2450 {
2451 SetAnimationPhase(slotNameMounted, 1);
2452 SetAnimationPhase(slot_name, 1);
2453
2454 DestroyAreaDamage(slotNameMounted);
2455 }
2456 }
2457
2458 // avoid calling this function on frequent occasions, it's a massive performance hit
2459 void UpdatePhysics()
2460 {
2462 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
2463
2464 array<string> attachmentSlots = new array<string>;
2465 GetAttachmentSlots(this, attachmentSlots);
2466
2468 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
2469
2470 foreach (string slotName : attachmentSlots)
2471 {
2473 }
2474
2475 //check base
2476 if (!HasBase())
2477 {
2479 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
2480
2481 AddProxyPhysics(ANIMATION_DEPLOYED);
2482 }
2483 else
2484 {
2486 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
2487
2488 RemoveProxyPhysics(ANIMATION_DEPLOYED);
2489 }
2490
2491 GetConstruction().UpdatePhysics();
2492 UpdateNavmesh();
2493 }
2494
2495 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
2496 {
2497 //checks for invalid appends; hotfix
2498 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
2499 return;
2500 //----------------------------------
2501 string slot_name_mounted = slot_name + "_Mounted";
2502 EntityAI attachment = FindAttachmentBySlotName( slot_name );
2503
2504 //remove proxy physics
2505 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
2506 RemoveProxyPhysics( slot_name_mounted );
2507 RemoveProxyPhysics( slot_name );
2508
2509 if ( attachment )
2510 {
2511 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
2512 if ( is_locked )
2513 {
2514 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
2515 AddProxyPhysics( slot_name_mounted );
2516 }
2517 else
2518 {
2519 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
2520 AddProxyPhysics( slot_name );
2521 }
2522 }
2523 }
2524
2525 protected void UpdateNavmesh()
2526 {
2527 SetAffectPathgraph( true, false );
2528 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
2529 }
2530
2531 override bool CanUseConstruction()
2532 {
2533 return true;
2534 }
2535
2536 override bool CanUseConstructionBuild()
2537 {
2538 return true;
2539 }
2540
2541 protected bool IsAttachmentSlotLocked( EntityAI attachment )
2542 {
2543 if ( attachment )
2544 {
2545 InventoryLocation inventory_location = new InventoryLocation;
2546 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
2547
2548 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
2549 }
2550
2551 return false;
2552 }
2553
2554 protected bool IsAttachmentSlotLocked( string slot_name )
2555 {
2556 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
2557 }
2558
2559 //--- ATTACHMENT SLOTS
2560 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
2561 {
2562 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
2563 if ( GetGame().ConfigIsExisting( config_path ) )
2564 {
2565 GetGame().ConfigGetTextArray( config_path, attachment_slots );
2566 }
2567 }
2568
2569 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
2570 {
2571 return true;
2572 }
2573
2574 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
2575 {
2576 return true;
2577 }
2578
2579 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
2580 {
2581 return true;
2582 }
2583
2584 // --- INIT
2585 void ConstructionInit()
2586 {
2587 if ( !m_Construction )
2588 {
2589 m_Construction = new Construction( this );
2590 }
2591
2592 GetConstruction().Init();
2593 }
2594
2596 {
2597 return m_Construction;
2598 }
2599
2600 //--- INVENTORY/ATTACHMENTS CONDITIONS
2601 //attachments
2602 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
2603 {
2604 return super.CanReceiveAttachment(attachment, slotId);
2605 }
2606
2608 {
2609 int attachment_count = GetInventory().AttachmentCount();
2610 if ( attachment_count > 0 )
2611 {
2612 if ( HasBase() && attachment_count == 1 )
2613 {
2614 return false;
2615 }
2616
2617 return true;
2618 }
2619
2620 return false;
2621 }
2622
2623 override bool ShowZonesHealth()
2624 {
2625 return true;
2626 }
2627
2628 override bool IsTakeable()
2629 {
2630 return false;
2631 }
2632
2633 //this into/outo parent.Cargo
2634 override bool CanPutInCargo( EntityAI parent )
2635 {
2636 return false;
2637 }
2638
2639 override bool CanRemoveFromCargo( EntityAI parent )
2640 {
2641 return false;
2642 }
2643
2644 //hands
2645 override bool CanPutIntoHands( EntityAI parent )
2646 {
2647 return false;
2648 }
2649
2650 //--- ACTION CONDITIONS
2651 //direction
2652 override bool IsFacingPlayer( PlayerBase player, string selection )
2653 {
2654 return true;
2655 }
2656
2657 override bool IsPlayerInside( PlayerBase player, string selection )
2658 {
2659 return true;
2660 }
2661
2664 {
2665 return false;
2666 }
2667
2668 //camera direction check
2669 bool IsFacingCamera( string selection )
2670 {
2671 return true;
2672 }
2673
2674 //roof check
2675 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
2676 {
2677 return false;
2678 }
2679
2680 //selection->player distance check
2681 bool HasProperDistance( string selection, PlayerBase player )
2682 {
2683 return true;
2684 }
2685
2686 //folding
2688 {
2689 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
2690 {
2691 return false;
2692 }
2693
2694 return true;
2695 }
2696
2698 {
2701
2702 return item;
2703 }
2704
2705 //Damage triggers (barbed wire)
2706 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
2707 {
2708 if ( GetGame() && GetGame().IsServer() )
2709 {
2710 //destroy area damage if some already exists
2711 DestroyAreaDamage( slot_name );
2712
2713 //create new area damage
2715 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
2716
2717 vector min_max[2];
2718 if ( MemoryPointExists( slot_name + "_min" ) )
2719 {
2720 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
2721 }
2722 if ( MemoryPointExists( slot_name + "_max" ) )
2723 {
2724 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
2725 }
2726
2727 //get proper trigger extents (min<max)
2728 vector extents[2];
2729 GetConstruction().GetTriggerExtents( min_max, extents );
2730
2731 //get box center
2732 vector center;
2733 center = GetConstruction().GetBoxCenter( min_max );
2734 center = ModelToWorld( center );
2735
2736 //rotate center if needed
2737 vector orientation = GetOrientation();;
2738 CalcDamageAreaRotation( rotation_angle, center, orientation );
2739
2740 areaDamage.SetExtents( extents[0], extents[1] );
2741 areaDamage.SetAreaPosition( center );
2742 areaDamage.SetAreaOrientation( orientation );
2743 areaDamage.SetLoopInterval( 1.0 );
2744 areaDamage.SetDeferDuration( 0.2 );
2745 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
2746 areaDamage.SetAmmoName( "BarbedWireHit" );
2747 areaDamage.Spawn();
2748
2749 m_DamageTriggers.Insert( slot_name, areaDamage );
2750 }
2751 }
2752
2753 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
2754 {
2755 if ( angle_deg != 0 )
2756 {
2757 //orientation
2758 orientation[0] = orientation[0] - angle_deg;
2759
2760 //center
2761 vector rotate_axis;
2762 if ( MemoryPointExists( "rotate_axis" ) )
2763 {
2764 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
2765 }
2766 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];
2767 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];
2768 center[0] = r_center_x;
2769 center[2] = r_center_z;
2770 }
2771 }
2772
2773 void DestroyAreaDamage( string slot_name )
2774 {
2775 if (GetGame() && GetGame().IsServer())
2776 {
2778 if (m_DamageTriggers.Find(slot_name, areaDamage))
2779 {
2780 if (areaDamage)
2781 {
2782 areaDamage.Destroy();
2783 }
2784
2785 m_DamageTriggers.Remove( slot_name );
2786 }
2787 }
2788 }
2789
2790 override bool IsIgnoredByConstruction()
2791 {
2792 return true;
2793 }
2794
2795 //================================================================
2796 // SOUNDS
2797 //================================================================
2798 protected void SoundBuildStart( string part_name )
2799 {
2800 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
2801 }
2802
2803 protected void SoundDismantleStart( string part_name )
2804 {
2805 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
2806 }
2807
2808 protected void SoundDestroyStart( string part_name )
2809 {
2810 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
2811 }
2812
2813 protected string GetBuildSoundByMaterial( string part_name )
2814 {
2815 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
2816
2817 switch ( material_type )
2818 {
2819 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
2820 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
2821 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
2822 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
2823 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
2824 }
2825
2826 return "";
2827 }
2828
2829 protected string GetDismantleSoundByMaterial( string part_name )
2830 {
2831 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
2832
2833 switch ( material_type )
2834 {
2835 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
2836 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
2837 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
2838 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
2839 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
2840 }
2841
2842 return "";
2843 }
2844
2845 //misc
2846 void CheckForHybridAttachments( EntityAI item, string slot_name )
2847 {
2848 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
2849 {
2850 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
2851 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
2852 {
2853 SetHealth(slot_name,"Health",item.GetHealth());
2854 }
2855 }
2856 }
2857
2858 override int GetDamageSystemVersionChange()
2859 {
2860 return 111;
2861 }
2862
2863 override void SetActions()
2864 {
2865 super.SetActions();
2866
2870 }
2871
2872 //================================================================
2873 // DEBUG
2874 //================================================================
2875 protected void DebugCustomState()
2876 {
2877 }
2878
2881 {
2882 return null;
2883 }
2884
2885 override void OnDebugSpawn()
2886 {
2887 FullyBuild();
2888 }
2889
2890 void FullyBuild()
2891 {
2893 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
2894
2895 Man p;
2896
2897 #ifdef SERVER
2898 array<Man> players = new array<Man>;
2899 GetGame().GetWorld().GetPlayerList(players);
2900 if (players.Count())
2901 p = players[0];
2902 #else
2903 p = GetGame().GetPlayer();
2904 #endif
2905
2906 foreach (ConstructionPart part : parts)
2907 {
2908 bool excluded = false;
2909 string partName = part.GetPartName();
2910 if (excludes)
2911 {
2912 foreach (string exclude : excludes)
2913 {
2914 if (partName.Contains(exclude))
2915 {
2916 excluded = true;
2917 break;
2918 }
2919 }
2920 }
2921
2922 if (!excluded)
2923 {
2924 OnPartBuiltServer(p, partName, AT_BUILD_PART);
2925 }
2926 }
2927
2928 GetConstruction().UpdateVisuals();
2929 }
2930}
2931
2932void bsbDebugPrint (string s)
2933{
2934#ifdef BSB_DEBUG
2935 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
2936#else
2937 //Print("" + s); // comment/uncomment to hide/see debug logs
2938#endif
2939}
2940void bsbDebugSpam (string s)
2941{
2942#ifdef BSB_DEBUG_SPAM
2943 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
2944#else
2945 //Print("" + s); // comment/uncomment to hide/see debug logs
2946#endif
2947}
const int AT_DISMANTLE_PART
Определения _constants.c:7
const int AT_DESTROY_PART
Определения _constants.c:8
const int AT_BUILD_PART
Определения _constants.c:6
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
vector GetOrientation()
Определения AreaDamageManager.c:306
void AreaDamageManager(EntityAI parent)
Определения AreaDamageManager.c:22
void OnPartDismantledClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1928
const string ANIMATION_DEPLOYED
Определения BaseBuildingBase.c:1293
override int GetHideIconMask()
Определения BaseBuildingBase.c:1378
override void OnStoreSave(ParamsWriteContext ctx)
Определения BaseBuildingBase.c:1685
void FullyBuild()
Определения BaseBuildingBase.c:2539
void UpdateVisuals()
Определения BaseBuildingBase.c:2055
void SetActionFromSyncData()
Определения BaseBuildingBase.c:1524
int m_SyncParts01
Определения BaseBuildingBase.c:1301
void UpdateNavmesh()
Определения BaseBuildingBase.c:2174
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2223
override void OnDebugSpawn()
Определения BaseBuildingBase.c:2534
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения BaseBuildingBase.c:2529
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:2457
const string SOUND_BUILD_WOOD_LOG
Определения BaseBuildingBase.c:1309
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:2447
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2074
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:2402
override bool CanObstruct()
Определения BaseBuildingBase.c:1373
bool HasAttachmentsBesidesBase()
Определения BaseBuildingBase.c:2256
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1413
const string SOUND_DISMANTLE_METAL
Определения BaseBuildingBase.c:1318
void InitBaseState()
Определения BaseBuildingBase.c:2030
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:2251
void BaseBuildingBase()
Определения BaseBuildingBase.c:1328
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:1741
void DestroyConstruction()
Определения BaseBuildingBase.c:1678
ref array< string > m_HybridAttachments
Определения BaseBuildingBase.c:1324
int m_InteractedPartId
Определения BaseBuildingBase.c:1304
bool m_HasBase
Определения BaseBuildingBase.c:1299
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2478
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:2190
void UpdatePhysics()
Определения BaseBuildingBase.c:2108
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2301
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1885
bool HasProperDistance(string selection, PlayerBase player)
Определения BaseBuildingBase.c:2330
override void OnCreatePhysics()
Определения BaseBuildingBase.c:1754
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1852
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:1511
const string SOUND_BUILD_WOOD_PLANK
Определения BaseBuildingBase.c:1310
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:1583
ref array< string > m_Mountables
Определения BaseBuildingBase.c:1325
const string SOUND_BUILD_WIRE
Определения BaseBuildingBase.c:1313
int m_SyncParts03
Определения BaseBuildingBase.c:1303
void ResetActionSyncData()
Определения BaseBuildingBase.c:1517
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:1368
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1892
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:2495
override void EEOnAfterLoad()
Определения BaseBuildingBase.c:1795
override void EEItemDetached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1827
vector GetKitSpawnPosition()
Определения BaseBuildingBase.c:1661
ref Construction m_Construction
Определения BaseBuildingBase.c:1297
bool IsFacingCamera(string selection)
Определения BaseBuildingBase.c:2318
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
Определения BaseBuildingBase.c:2218
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:2209
override bool IsDeployable()
Определения BaseBuildingBase.c:1630
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1971
override void EEInit()
Определения BaseBuildingBase.c:1805
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1442
void bsbDebugSpam(string s)
Определения BaseBuildingBase.c:1300
override void OnVariablesSynchronized()
Определения BaseBuildingBase.c:1392
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения BaseBuildingBase.c:2324
Construction GetConstruction()
Определения BaseBuildingBase.c:2244
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:2452
void DebugCustomState()
Определения BaseBuildingBase.c:2524
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:1599
string GetConstructionKitType()
Определения BaseBuildingBase.c:1666
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2228
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения BaseBuildingBase.c:1935
bool CanFoldBaseBuildingObject()
Определения BaseBuildingBase.c:2336
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:2507
const string SOUND_DISMANTLE_WOOD_PLANK
Определения BaseBuildingBase.c:1316
override void EEItemAttached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1818
const string SOUND_DISMANTLE_WOOD_LOG
Определения BaseBuildingBase.c:1315
void InitVisuals()
Определения BaseBuildingBase.c:2039
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
Определения BaseBuildingBase.c:1292
const string SOUND_BUILD_WOOD_STAIRS
Определения BaseBuildingBase.c:1311
ItemBase FoldBaseBuildingObject()
Определения BaseBuildingBase.c:2346
override bool CanPutInCargo(EntityAI parent)
Определения BaseBuildingBase.c:2283
override bool CanUseConstruction()
Определения BaseBuildingBase.c:2180
override void AfterStoreLoad()
Определения BaseBuildingBase.c:1731
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:1541
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:1761
override bool IgnoreOutOfReachCondition()
Определения BaseBuildingBase.c:1845
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BaseBuildingBase.c:1697
override bool ShowZonesHealth()
Определения BaseBuildingBase.c:2272
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2144
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2306
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2462
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:1641
const string SOUND_DISMANTLE_WIRE
Определения BaseBuildingBase.c:1319
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
Определения BaseBuildingBase.c:2312
override bool IsTakeable()
Определения BaseBuildingBase.c:2277
float m_ConstructionKitHealth
Определения BaseBuildingBase.c:1295
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:1357
override void SetActions()
Определения BaseBuildingBase.c:2512
void HandleItemFalling(ConstructionPart part)
Определения BaseBuildingBase.c:1977
void DestroyConstructionKit(ItemBase construction_kit)
Определения BaseBuildingBase.c:1671
void CreateConstructionKitInHands(notnull PlayerBase player)
Определения BaseBuildingBase.c:1652
bool IsOpened()
Определения BaseBuildingBase.c:1635
void ItemFall(vector min, vector max)
Определения BaseBuildingBase.c:2015
int m_PerformedActionId
Определения BaseBuildingBase.c:1305
override bool CanUseConstructionBuild()
Определения BaseBuildingBase.c:2185
bool HasBase()
Определения BaseBuildingBase.c:1620
void OnSynchronizedClient()
Определения BaseBuildingBase.c:1400
void SynchronizeBaseState()
Определения BaseBuildingBase.c:1384
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:2439
ref map< string, ref AreaDamageManager > m_DamageTriggers
Определения BaseBuildingBase.c:1323
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:1625
const string SOUND_BUILD_METAL
Определения BaseBuildingBase.c:1312
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
Определения BaseBuildingBase.c:1835
override bool CanPutIntoHands(EntityAI parent)
Определения BaseBuildingBase.c:2294
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:1471
override bool CanRemoveFromCargo(EntityAI parent)
Определения BaseBuildingBase.c:2288
void ConstructionInit()
Определения BaseBuildingBase.c:2234
int m_SyncParts02
Определения BaseBuildingBase.c:1302
const string SOUND_DISMANTLE_WOOD_STAIRS
Определения BaseBuildingBase.c:1317
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
PlayerSpawnPreset slotName
ConstructionMaterialType
Определения Construction.c:2
void Construction(BaseBuildingBase parent)
Определения Construction.c:26
map
Определения ControlsXboxNew.c:4
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
void DestroyAreaDamage()
Определения FireplaceBase.c:2338
void CreateAreaDamage()
Определения FireplaceBase.c:2322
EffectSound m_Sound
Определения HungerSoundHandler.c:18
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
Определения ActionTakeItem.c:7
const int HITZONE
Определения AreaDamageManager.c:4
override void SetLoopInterval(float time)
Определения AreaDamageLooped.c:32
A particular version of the deferred loop used to not damage players inside vehicles.
override void SetDeferDuration(float time)
Определения AreaDamageLoopedDeferred.c:7
proto native World GetWorld()
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void ObjectDelete(Object obj)
Super root of all classes in Enforce script.
Определения EnScript.c:11
int GetId()
Определения ConstructionPart.c:40
string GetPartName()
Определения ConstructionPart.c:30
bool IsBase()
Определения ConstructionPart.c:65
bool IsBuilt()
Определения ConstructionPart.c:45
string m_PartName
Определения ConstructionPart.c:5
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения Debug.c:122
Определения Debug.c:2
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
Определения Building.c:6
Определения constants.c:659
proto native int GetSlot()
returns slot id if current type is Attachment
InventoryLocation.
Определения InventoryLocation.c:29
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
Определения InventorySlots.c:6
override bool CanUseConstruction()
Определения BaseBuildingBase.c:891
Определения InventoryItem.c:731
static bool IsBaseBuildingLogEnable()
Определения Debug.c:698
Определения Debug.c:594
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native void GetPlayerList(out array< Man > players)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static const vector Zero
Определения EnConvert.c:110
Определения EnConvert.c:106
override string GetDebugName()
Определения dayzplayer.c:1170
Serializer ParamsReadContext
Определения gameplay.c:15
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const int STATE_RUINED
Определения constants.c:846
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto float Cos(float angle)
Returns cosinus of angle in radians.
static proto float Sin(float angle)
Returns sinus of angle in radians.
static const float DEG2RAD
Определения EnMath.c:17
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
proto int ToLower()
Changes string to lowercase. Returns length.
const int CALL_CATEGORY_GAMEPLAY
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8

Используется в ItemBase::FoldBaseBuildingObject(), TerritoryFlag::FullyBuild() и ItemBase::OnPartBuiltServer().