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

◆ SetActionFromSyncData()

void bsbDebugPrint::SetActionFromSyncData ( )
protected

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

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

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