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

◆ HasBase()

bool bsbDebugPrint::HasBase ( )
protected

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

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

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