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

◆ BaseBuildingBase()

void bsbDebugPrint::BaseBuildingBase ( )
protected

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

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