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

◆ RegisterPartForSync()

void bsbDebugPrint::RegisterPartForSync ( int part_id)
protected

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

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

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