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

◆ SetActionFromSyncData()

void bsbDebugPrint::SetActionFromSyncData ( )
protected

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

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

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