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

◆ SynchronizeBaseState()

void bsbDebugPrint::SynchronizeBaseState ( )
protected

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

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

Используется в BaseBuildingBase::CloseFence(), TerritoryFlag::FullyBuild(), ItemBase::OnPartBuiltServer(), ItemBase::OnPartDestroyedServer(), ItemBase::OnPartDismantledServer(), BaseBuildingBase::OpenFence() и ItemBase::SetPartsAfterStoreLoad().