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

◆ SetPartFromSyncData()

void bsbDebugPrint::SetPartFromSyncData ( ConstructionPart part)
protected

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

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

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