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

◆ OnSynchronizedClient()

void bsbDebugPrint::OnSynchronizedClient ( )
protected

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

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