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

◆ EEDelete()

override void bsbDebugPrint::EEDelete ( EntityAI parent)
protected

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

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