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

◆ CanObstruct()

override bool bsbDebugPrint::CanObstruct ( )
protected

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

1395{
1396 const string ANIMATION_DEPLOYED = "Deployed";
1397
1398 float m_ConstructionKitHealth; //stored health value for used construction kit
1399
1401
1402 bool m_HasBase;
1403 //variables for synchronization of base building parts (2x31 is the current limit)
1404 int m_SyncParts01; //synchronization for already built parts (31 parts)
1405 int m_SyncParts02; //synchronization for already built parts (+31 parts)
1406 int m_SyncParts03; //synchronization for already built parts (+31 parts)
1407 int m_InteractedPartId; //construction part id that an action was performed on
1408 int m_PerformedActionId; //action id that was performed on a construction part
1409
1410 //Sounds
1411 //build
1412 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
1413 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
1414 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
1415 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
1416 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
1417 //dismantle
1418 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
1419 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
1420 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
1421 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
1422 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
1423
1424 protected EffectSound m_Sound;
1425
1429
1430 // Constructor
1431 void BaseBuildingBase()
1432 {
1434
1435 //synchronized variables
1436 RegisterNetSyncVariableInt( "m_SyncParts01" );
1437 RegisterNetSyncVariableInt( "m_SyncParts02" );
1438 RegisterNetSyncVariableInt( "m_SyncParts03" );
1439 RegisterNetSyncVariableInt( "m_InteractedPartId" );
1440 RegisterNetSyncVariableInt( "m_PerformedActionId" );
1441 RegisterNetSyncVariableBool( "m_HasBase" );
1442
1443 //Construction init
1445
1446 if (ConfigIsExisting("hybridAttachments"))
1447 {
1449 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
1450 }
1451 if (ConfigIsExisting("mountables"))
1452 {
1454 ConfigGetTextArray("mountables", m_Mountables);
1455 }
1456
1457 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
1458 }
1459
1460 override void EEDelete(EntityAI parent)
1461 {
1462 super.EEDelete(parent);
1463
1464 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
1465 {
1466 areaDamage.Destroy();
1467 }
1468
1469 }
1470
1471 override string GetInvulnerabilityTypeString()
1472 {
1473 return "disableBaseDamage";
1474 }
1475
1476 override bool CanObstruct()
1477 {
1478 return true;
1479 }
1480
1481 override int GetHideIconMask()
1482 {
1483 return EInventoryIconVisibility.HIDE_VICINITY;
1484 }
1485
1486 override void InitItemSounds()
1487 {
1488 super.InitItemSounds();
1489
1491 SoundParameters params = new SoundParameters();
1492 params.m_Loop = true;
1493
1494 if (GetFoldSoundset() != string.Empty)
1495 handler.AddSound(SoundConstants.ITEM_FOLD, GetFoldSoundset());
1496 if (GetLoopFoldSoundset() != string.Empty)
1497 handler.AddSound(SoundConstants.ITEM_FOLD_LOOP, GetLoopFoldSoundset(), params);
1498 }
1499
1500 override string GetFoldSoundset()
1501 {
1502 return "putDown_FenceKit_SoundSet";
1503 }
1504
1505 override string GetLoopFoldSoundset()
1506 {
1507 return "Shelter_Site_Build_Loop_SoundSet";
1508 }
1509
1510 // --- SYNCHRONIZATION
1512 {
1513 if ( GetGame().IsServer() )
1514 {
1515 SetSynchDirty();
1516 }
1517 }
1518
1519 override void OnVariablesSynchronized()
1520 {
1521 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
1522 super.OnVariablesSynchronized();
1523
1525 }
1526
1527 protected void OnSynchronizedClient()
1528 {
1529 //update parts
1531
1532 //update action on part
1534
1535 //update visuals (client)
1536 UpdateVisuals();
1537 }
1538
1539 //parts synchronization
1540 void RegisterPartForSync( int part_id )
1541 {
1542 //part_id must starts from index = 1
1543 int offset;
1544 int mask;
1545
1546 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
1547 {
1548 offset = part_id - 1;
1549 mask = 1 << offset;
1550
1551 m_SyncParts01 = m_SyncParts01 | mask;
1552 }
1553 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
1554 {
1555 offset = ( part_id % 32 );
1556 mask = 1 << offset;
1557
1558 m_SyncParts02 = m_SyncParts02 | mask;
1559 }
1560 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
1561 {
1562 offset = ( part_id % 63 );
1563 mask = 1 << offset;
1564
1565 m_SyncParts03 = m_SyncParts03 | mask;
1566 }
1567 }
1568
1569 void UnregisterPartForSync( int part_id )
1570 {
1571 //part_id must starts from index = 1
1572 int offset;
1573 int mask;
1574
1575 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
1576 {
1577 offset = part_id - 1;
1578 mask = 1 << offset;
1579
1580 m_SyncParts01 = m_SyncParts01 & ~mask;
1581 }
1582 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
1583 {
1584 offset = ( part_id % 32 );
1585 mask = 1 << offset;
1586
1587 m_SyncParts02 = m_SyncParts02 & ~mask;
1588 }
1589 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
1590 {
1591 offset = ( part_id % 63 );
1592 mask = 1 << offset;
1593
1594 m_SyncParts03 = m_SyncParts03 & ~mask;
1595 }
1596 }
1597
1598 bool IsPartBuildInSyncData( int part_id )
1599 {
1600 //part_id must starts from index = 1
1601 int offset;
1602 int mask;
1603
1604 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
1605 {
1606 offset = part_id - 1;
1607 mask = 1 << offset;
1608
1609 if ( ( m_SyncParts01 & mask ) > 0 )
1610 {
1611 return true;
1612 }
1613 }
1614 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
1615 {
1616 offset = ( part_id % 32 );
1617 mask = 1 << offset;
1618
1619 if ( ( m_SyncParts02 & mask ) > 0 )
1620 {
1621 return true;
1622 }
1623 }
1624 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
1625 {
1626 offset = ( part_id % 63 );
1627 mask = 1 << offset;
1628
1629 if ( ( m_SyncParts03 & mask ) > 0 )
1630 {
1631 return true;
1632 }
1633 }
1634
1635 return false;
1636 }
1637
1638 protected void RegisterActionForSync( int part_id, int action_id )
1639 {
1640 m_InteractedPartId = part_id;
1641 m_PerformedActionId = action_id;
1642 }
1643
1644 protected void ResetActionSyncData()
1645 {
1646 //reset data
1647 m_InteractedPartId = -1;
1649 }
1650
1651 protected void SetActionFromSyncData()
1652 {
1653 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
1654 {
1656 int build_action_id = m_PerformedActionId;
1657
1658 switch( build_action_id )
1659 {
1660 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
1661 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
1662 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
1663 }
1664 }
1665 }
1666 //------
1667
1669 {
1670 string key = part.m_PartName;
1671 bool is_base = part.IsBase();
1672 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
1673 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
1674 if ( is_part_built_sync )
1675 {
1676 if ( !part.IsBuilt() )
1677 {
1678 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
1679 GetConstruction().AddToConstructedParts( key );
1680 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
1681
1682 if (is_base)
1683 {
1685 RemoveProxyPhysics( ANIMATION_DEPLOYED );
1686 }
1687 }
1688 }
1689 else
1690 {
1691 if ( part.IsBuilt() )
1692 {
1693 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
1694 GetConstruction().RemoveFromConstructedParts( key );
1695 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
1696
1697 if (is_base)
1698 {
1700 AddProxyPhysics( ANIMATION_DEPLOYED );
1701 }
1702 }
1703 }
1704
1705 //check slot lock for material attachments
1706 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
1707 }
1708
1709 //set construction parts based on synchronized data
1711 {
1712 Construction construction = GetConstruction();
1713 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
1714
1715 for ( int i = 0; i < construction_parts.Count(); ++i )
1716 {
1717 string key = construction_parts.GetKey( i );
1718 ConstructionPart value = construction_parts.Get( key );
1719 SetPartFromSyncData(value);
1720 }
1721
1722 //regenerate navmesh
1723 UpdateNavmesh();
1724 }
1725
1726 protected ConstructionPart GetConstructionPartById( int id )
1727 {
1728 Construction construction = GetConstruction();
1729 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
1730
1731 for ( int i = 0; i < construction_parts.Count(); ++i )
1732 {
1733 string key = construction_parts.GetKey( i );
1734 ConstructionPart value = construction_parts.Get( key );
1735
1736 if ( value.GetId() == id )
1737 {
1738 return value;
1739 }
1740 }
1741
1742 return NULL;
1743 }
1744 //
1745
1746 //Base
1747 bool HasBase()
1748 {
1749 return m_HasBase;
1750 }
1751
1752 void SetBaseState( bool has_base )
1753 {
1754 m_HasBase = has_base;
1755 }
1756
1757 override bool IsDeployable()
1758 {
1759 return true;
1760 }
1761
1762 bool IsOpened()
1763 {
1764 return false;
1765 }
1766
1767 //--- CONSTRUCTION KIT
1769 {
1770 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
1771 if ( m_ConstructionKitHealth > 0 )
1772 {
1773 construction_kit.SetHealth( m_ConstructionKitHealth );
1774 }
1775
1776 return construction_kit;
1777 }
1778
1779 void CreateConstructionKitInHands(notnull PlayerBase player)
1780 {
1781 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
1782 if ( m_ConstructionKitHealth > 0 )
1783 {
1784 construction_kit.SetHealth( m_ConstructionKitHealth );
1785 }
1786 }
1787
1788 protected vector GetKitSpawnPosition()
1789 {
1790 return GetPosition();
1791 }
1792
1793 protected string GetConstructionKitType()
1794 {
1795 return "";
1796 }
1797
1798 void DestroyConstructionKit( ItemBase construction_kit )
1799 {
1800 m_ConstructionKitHealth = construction_kit.GetHealth();
1801 GetGame().ObjectDelete( construction_kit );
1802 }
1803
1804 //--- CONSTRUCTION
1805 void DestroyConstruction()
1806 {
1807 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
1808 GetGame().ObjectDelete( this );
1809 }
1810
1811 // --- EVENTS
1812 override void OnStoreSave( ParamsWriteContext ctx )
1813 {
1814 super.OnStoreSave( ctx );
1815
1816 //sync parts 01
1817 ctx.Write( m_SyncParts01 );
1818 ctx.Write( m_SyncParts02 );
1819 ctx.Write( m_SyncParts03 );
1820
1821 ctx.Write( m_HasBase );
1822 }
1823
1824 override bool OnStoreLoad( ParamsReadContext ctx, int version )
1825 {
1826 if ( !super.OnStoreLoad( ctx, version ) )
1827 return false;
1828
1829 //--- Base building data ---
1830 //Restore synced parts data
1831 if ( !ctx.Read( m_SyncParts01 ) )
1832 {
1833 m_SyncParts01 = 0; //set default
1834 return false;
1835 }
1836 if ( !ctx.Read( m_SyncParts02 ) )
1837 {
1838 m_SyncParts02 = 0; //set default
1839 return false;
1840 }
1841 if ( !ctx.Read( m_SyncParts03 ) )
1842 {
1843 m_SyncParts03 = 0; //set default
1844 return false;
1845 }
1846
1847 //has base
1848 if ( !ctx.Read( m_HasBase ) )
1849 {
1850 m_HasBase = false;
1851 return false;
1852 }
1853 //---
1854
1855 return true;
1856 }
1857
1858 override void AfterStoreLoad()
1859 {
1860 super.AfterStoreLoad();
1861
1863 {
1865 }
1866 }
1867
1869 {
1870 //update server data
1872
1873 //set base state
1874 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
1875 SetBaseState( construction_part.IsBuilt() ) ;
1876
1877 //synchronize after load
1879 }
1880
1881 override void OnCreatePhysics()
1882 {
1883 super.OnCreatePhysics();
1886 }
1887
1888 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
1889 {
1891 return;
1892
1893 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1894
1895 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
1896 return;
1897
1898 Construction construction = GetConstruction();
1899 string part_name = zone;
1900 part_name.ToLower();
1901
1902 if ( newLevel == GameConstants.STATE_RUINED )
1903 {
1904 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
1905
1906 if ( construction_part && construction.IsPartConstructed( part_name ) )
1907 {
1908 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
1909 construction.DestroyConnectedParts(part_name);
1910 }
1911
1912 //barbed wire handling (hack-ish)
1913 if ( part_name.Contains("barbed") )
1914 {
1915 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
1916 if (barbed_wire)
1917 barbed_wire.SetMountedState( false );
1918 }
1919 }
1920 }
1921
1922 override void EEOnAfterLoad()
1923 {
1925 {
1927 }
1928
1929 super.EEOnAfterLoad();
1930 }
1931
1932 override void EEInit()
1933 {
1934 super.EEInit();
1935
1936 // init visuals and physics
1937 InitBaseState();
1938
1939 //debug
1940 #ifdef DEVELOPER
1942 #endif
1943 }
1944
1945 override void EEItemAttached( EntityAI item, string slot_name )
1946 {
1947 super.EEItemAttached( item, slot_name );
1948
1949 CheckForHybridAttachments( item, slot_name );
1950 UpdateVisuals();
1951 UpdateAttachmentPhysics( slot_name, false );
1952 }
1953
1954 override void EEItemDetached( EntityAI item, string slot_name )
1955 {
1956 super.EEItemDetached( item, slot_name );
1957
1958 UpdateVisuals();
1959 UpdateAttachmentPhysics( slot_name, false );
1960 }
1961
1962 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
1963 {
1964 string slot_name = InventorySlots.GetSlotName( slotId );
1965 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
1966
1967 UpdateAttachmentVisuals( slot_name, locked );
1968 UpdateAttachmentPhysics( slot_name, locked );
1969 }
1970
1971 //ignore out of reach condition
1972 override bool IgnoreOutOfReachCondition()
1973 {
1974 return true;
1975 }
1976
1977 //CONSTRUCTION EVENTS
1978 //Build
1979 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
1980 {
1981 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
1982
1983 //check base state
1984 if (construtionPart.IsBase())
1985 {
1986 SetBaseState(true);
1987
1988 //spawn kit
1990 }
1991
1992 //register constructed parts for synchronization
1993 RegisterPartForSync(construtionPart.GetId());
1994
1995 //register action that was performed on part
1996 RegisterActionForSync(construtionPart.GetId(), action_id);
1997
1998 //synchronize
2000
2001 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
2002
2003 UpdateNavmesh();
2004
2005 //update visuals
2006 UpdateVisuals();
2007
2008 //reset action sync data
2010 }
2011
2012 void OnPartBuiltClient(string part_name, int action_id)
2013 {
2014 //play sound
2015 SoundBuildStart( part_name );
2016 }
2017
2018 //Dismantle
2019 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
2020 {
2021 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
2022 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2023
2024 //register constructed parts for synchronization
2025 UnregisterPartForSync(construtionPart.GetId());
2026
2027 //register action that was performed on part
2028 RegisterActionForSync(construtionPart.GetId(), action_id);
2029
2030 //synchronize
2032
2033 // server part of sync, client will be synced from SetPartsFromSyncData
2034 SetPartFromSyncData(construtionPart);
2035
2036 UpdateNavmesh();
2037
2038 //update visuals
2039 UpdateVisuals();
2040
2041 //reset action sync data
2043
2044 //check base state
2045 if (construtionPart.IsBase())
2046 {
2047 //Destroy construction
2049 }
2050 }
2051
2052 void OnPartDismantledClient( string part_name, int action_id )
2053 {
2054 //play sound
2055 SoundDismantleStart( part_name );
2056 }
2057
2058 //Destroy
2059 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
2060 {
2061 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
2062 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2063
2064 //register constructed parts for synchronization
2065 UnregisterPartForSync(construtionPart.GetId());
2066
2067 //register action that was performed on part
2068 RegisterActionForSync(construtionPart.GetId(), action_id);
2069
2070 //synchronize
2072
2073 // server part of sync, client will be synced from SetPartsFromSyncData
2074 SetPartFromSyncData(construtionPart);
2075
2076 UpdateNavmesh();
2077
2078 //update visuals
2079 UpdateVisuals();
2080
2081 //reset action sync data
2083
2084 //check base state
2085 if (construtionPart.IsBase())
2086 {
2087 //Destroy construction
2089 }
2090 }
2091
2092 void OnPartDestroyedClient( string part_name, int action_id )
2093 {
2094 //play sound
2095 SoundDestroyStart( part_name );
2096 }
2097
2099 protected void HandleItemFalling(ConstructionPart part)
2100 {
2101 bool process = false;
2102
2103 //TODO: add a parameter to parts' config classes?
2104 process |= part.m_PartName.Contains("_roof");
2105 process |= part.m_PartName.Contains("_platform");
2106 process |= part.m_PartName.Contains("_stair");
2107
2108 if (process)
2109 {
2110 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
2111 {
2112 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
2113 return;
2114 }
2115
2116 vector mins, maxs;
2117 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
2118 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
2119
2120 //sanitize minmaxs
2121 vector minTmp, maxTmp;
2122 minTmp[0] = Math.Min(mins[0],maxs[0]);
2123 maxTmp[0] = Math.Max(mins[0],maxs[0]);
2124 minTmp[1] = Math.Min(mins[1],maxs[1]);
2125 maxTmp[1] = Math.Max(mins[1],maxs[1]);
2126 minTmp[2] = Math.Min(mins[2],maxs[2]);
2127 maxTmp[2] = Math.Max(mins[2],maxs[2]);
2128 mins = minTmp;
2129 maxs = maxTmp;
2130
2131 maxs[1] = maxs[1] + 0.35; //reach a little above..
2132
2133 ItemFall(mins,maxs);
2134 }
2135 }
2136
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
const int AT_DESTROY_PART
const int AT_BUILD_PART
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
vector GetOrientation()
Определения AreaDamageManager.c:306
void AreaDamageManager(EntityAI parent)
Определения AreaDamageManager.c:22
void OnPartDismantledClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1969
const string ANIMATION_DEPLOYED
Определения BaseBuildingBase.c:1313
override int GetHideIconMask()
Определения BaseBuildingBase.c:1398
override void OnStoreSave(ParamsWriteContext ctx)
Определения BaseBuildingBase.c:1729
void FullyBuild()
Определения BaseBuildingBase.c:2579
void UpdateVisuals()
Определения BaseBuildingBase.c:2095
void SetActionFromSyncData()
Определения BaseBuildingBase.c:1568
int m_SyncParts01
Определения BaseBuildingBase.c:1321
void UpdateNavmesh()
Определения BaseBuildingBase.c:2214
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2263
override void OnDebugSpawn()
Определения BaseBuildingBase.c:2574
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения BaseBuildingBase.c:2569
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:2497
const string SOUND_BUILD_WOOD_LOG
Определения BaseBuildingBase.c:1329
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:2487
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2114
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:2442
override bool CanObstruct()
Определения BaseBuildingBase.c:1393
bool HasAttachmentsBesidesBase()
Определения BaseBuildingBase.c:2296
override void InitItemSounds()
Определения BaseBuildingBase.c:1403
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1457
const string SOUND_DISMANTLE_METAL
Определения BaseBuildingBase.c:1338
void InitBaseState()
Определения BaseBuildingBase.c:2070
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:2291
void BaseBuildingBase()
Определения BaseBuildingBase.c:1348
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:1785
void DestroyConstruction()
Определения BaseBuildingBase.c:1722
ref array< string > m_HybridAttachments
Определения BaseBuildingBase.c:1344
int m_InteractedPartId
Определения BaseBuildingBase.c:1324
override string GetFoldSoundset()
Определения BaseBuildingBase.c:1417
bool m_HasBase
Определения BaseBuildingBase.c:1319
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2518
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:2230
void UpdatePhysics()
Определения BaseBuildingBase.c:2148
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2341
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1929
bool HasProperDistance(string selection, PlayerBase player)
Определения BaseBuildingBase.c:2370
override void OnCreatePhysics()
Определения BaseBuildingBase.c:1798
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1896
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:1555
const string SOUND_BUILD_WOOD_PLANK
Определения BaseBuildingBase.c:1330
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:1627
ref array< string > m_Mountables
Определения BaseBuildingBase.c:1345
const string SOUND_BUILD_WIRE
Определения BaseBuildingBase.c:1333
int m_SyncParts03
Определения BaseBuildingBase.c:1323
void ResetActionSyncData()
Определения BaseBuildingBase.c:1561
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:1388
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:1936
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:2535
override void EEOnAfterLoad()
Определения BaseBuildingBase.c:1839
override void EEItemDetached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1871
vector GetKitSpawnPosition()
Определения BaseBuildingBase.c:1705
ref Construction m_Construction
Определения BaseBuildingBase.c:1317
bool IsFacingCamera(string selection)
Определения BaseBuildingBase.c:2358
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
Определения BaseBuildingBase.c:2258
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:2249
override bool IsDeployable()
Определения BaseBuildingBase.c:1674
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:2009
override void EEInit()
Определения BaseBuildingBase.c:1849
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1486
void bsbDebugSpam(string s)
Определения BaseBuildingBase.c:1320
override void OnVariablesSynchronized()
Определения BaseBuildingBase.c:1436
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения BaseBuildingBase.c:2364
Construction GetConstruction()
Определения BaseBuildingBase.c:2284
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:2492
void DebugCustomState()
Определения BaseBuildingBase.c:2564
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:1643
string GetConstructionKitType()
Определения BaseBuildingBase.c:1710
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:2268
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения BaseBuildingBase.c:1976
bool CanFoldBaseBuildingObject()
Определения BaseBuildingBase.c:2376
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:2547
const string SOUND_DISMANTLE_WOOD_PLANK
Определения BaseBuildingBase.c:1336
override void EEItemAttached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1862
const string SOUND_DISMANTLE_WOOD_LOG
Определения BaseBuildingBase.c:1335
void InitVisuals()
Определения BaseBuildingBase.c:2079
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
Определения BaseBuildingBase.c:1312
const string SOUND_BUILD_WOOD_STAIRS
Определения BaseBuildingBase.c:1331
ItemBase FoldBaseBuildingObject()
Определения BaseBuildingBase.c:2386
override bool CanPutInCargo(EntityAI parent)
Определения BaseBuildingBase.c:2323
override bool CanUseConstruction()
Определения BaseBuildingBase.c:2220
override void AfterStoreLoad()
Определения BaseBuildingBase.c:1775
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:1585
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:1805
override bool IgnoreOutOfReachCondition()
Определения BaseBuildingBase.c:1889
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BaseBuildingBase.c:1741
override bool ShowZonesHealth()
Определения BaseBuildingBase.c:2312
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2184
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:2346
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2502
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:1685
const string SOUND_DISMANTLE_WIRE
Определения BaseBuildingBase.c:1339
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
Определения BaseBuildingBase.c:2352
override bool IsTakeable()
Определения BaseBuildingBase.c:2317
float m_ConstructionKitHealth
Определения BaseBuildingBase.c:1315
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:1377
override void SetActions()
Определения BaseBuildingBase.c:2552
void HandleItemFalling(ConstructionPart part)
Disconnected temporarily.
Определения BaseBuildingBase.c:2016
void DestroyConstructionKit(ItemBase construction_kit)
Определения BaseBuildingBase.c:1715
void CreateConstructionKitInHands(notnull PlayerBase player)
Определения BaseBuildingBase.c:1696
bool IsOpened()
Определения BaseBuildingBase.c:1679
void ItemFall(vector min, vector max)
Disconnected temporarily.
Определения BaseBuildingBase.c:2055
int m_PerformedActionId
Определения BaseBuildingBase.c:1325
override bool CanUseConstructionBuild()
Определения BaseBuildingBase.c:2225
bool HasBase()
Определения BaseBuildingBase.c:1664
void OnSynchronizedClient()
Определения BaseBuildingBase.c:1444
void SynchronizeBaseState()
Определения BaseBuildingBase.c:1428
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:2479
ref map< string, ref AreaDamageManager > m_DamageTriggers
Определения BaseBuildingBase.c:1343
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:1669
const string SOUND_BUILD_METAL
Определения BaseBuildingBase.c:1332
override string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:1422
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
Определения BaseBuildingBase.c:1879
override bool CanPutIntoHands(EntityAI parent)
Определения BaseBuildingBase.c:2334
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:1515
override bool CanRemoveFromCargo(EntityAI parent)
Определения BaseBuildingBase.c:2328
void ConstructionInit()
Определения BaseBuildingBase.c:2274
int m_SyncParts02
Определения BaseBuildingBase.c:1322
const string SOUND_DISMANTLE_WOOD_STAIRS
Определения BaseBuildingBase.c:1337
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
PlayerSpawnPreset slotName
ConstructionMaterialType
Определения Construction.c:2
void Construction(BaseBuildingBase parent)
Определения Construction.c:26
map
Определения ControlsXboxNew.c:4
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
void DestroyAreaDamage()
Определения FireplaceBase.c:2345
void CreateAreaDamage()
Определения FireplaceBase.c:2329
Empty
Определения Hand_States.c:14
EffectSound m_Sound
Определения HungerSoundHandler.c:18
string GetFoldSoundset()
Определения BaseBuildingBase.c:1417
string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:1422
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9229
bool m_FixDamageSystemInit
Определения ItemBase.c:4907
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
Определения ActionTakeItem.c:7
const int HITZONE
Определения AreaDamageManager.c:4
override void SetLoopInterval(float time)
Определения AreaDamageLooped.c:32
A particular version of the deferred loop used to not damage players inside vehicles.
override void SetDeferDuration(float time)
Определения AreaDamageLoopedDeferred.c:7
proto native World GetWorld()
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void ObjectDelete(Object obj)
Super root of all classes in Enforce script.
Определения EnScript.c:11
int GetId()
Определения ConstructionPart.c:40
string GetPartName()
Определения ConstructionPart.c:30
bool IsBase()
Определения ConstructionPart.c:65
bool IsBuilt()
Определения ConstructionPart.c:45
string m_PartName
Определения ConstructionPart.c:5
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения 3_Game/tools/Debug.c:122
Определения 3_Game/tools/Debug.c:2
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
proto native int GetSlot()
returns slot id if current type is Attachment
InventoryLocation.
Определения InventoryLocation.c:29
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
Определения InventorySlots.c:6
override bool CanUseConstruction()
Определения BaseBuildingBase.c:911
static bool IsBaseBuildingLogEnable()
Определения 3_Game/tools/Debug.c:698
Определения 3_Game/tools/Debug.c:594
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
proto native void GetPlayerList(out array< Man > players)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static const vector Zero
Определения EnConvert.c:110
Определения EnConvert.c:106
override string GetDebugName()
Определения dayzplayer.c:1170
Serializer ParamsReadContext
Определения gameplay.c:15
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const int STATE_RUINED
Определения 3_Game/constants.c:848
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto float Cos(float angle)
Returns cosinus of angle in radians.
static proto float Sin(float angle)
Returns sinus of angle in radians.
static const float DEG2RAD
Определения EnMath.c:17
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
proto int ToLower()
Changes string to lowercase. Returns length.
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/tools/tools.c:8