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

◆ IsPartBuildInSyncData()

bool bsbDebugPrint::IsPartBuildInSyncData ( int part_id)
protected

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

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

Используется в ItemBase::SetPartFromSyncData().