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

◆ SetPartsFromSyncData()

void bsbDebugPrint::SetPartsFromSyncData ( )
protected

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

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