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

◆ ResetActionSyncData()

void bsbDebugPrint::ResetActionSyncData ( )
protected

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

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