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

◆ UnregisterPartForSync()

void bsbDebugPrint::UnregisterPartForSync ( int part_id)
protected

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

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