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

◆ RegisterActionForSync()

void bsbDebugPrint::RegisterActionForSync ( int part_id,
int action_id )
protected

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

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