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

◆ EEDelete()

override void bsbDebugPrint::EEDelete ( EntityAI parent)
protected

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

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