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

◆ RegisterPartForSync()

void bsbDebugPrint::RegisterPartForSync ( int part_id)
protected

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

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

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