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

◆ ResetActionSyncData()

void bsbDebugPrint::ResetActionSyncData ( )
protected

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

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

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