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

◆ OnVariablesSynchronized()

override void bsbDebugPrint::OnVariablesSynchronized ( )
protected

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

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