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

◆ OnVariablesSynchronized()

override void bsbDebugPrint::OnVariablesSynchronized ( )
protected

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

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