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

◆ BaseBuildingBase()

void bsbDebugPrint::BaseBuildingBase ( )
protected

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

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