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

◆ CreateConstructionKitInHands()

void bsbDebugPrint::CreateConstructionKitInHands ( notnull PlayerBase player)
protected

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

1654{
1655 const string ANIMATION_DEPLOYED = "Deployed";
1656
1657 float m_ConstructionKitHealth; //stored health value for used construction kit
1658
1660
1661 bool m_HasBase;
1662 //variables for synchronization of base building parts (2x31 is the current limit)
1663 int m_SyncParts01; //synchronization for already built parts (31 parts)
1664 int m_SyncParts02; //synchronization for already built parts (+31 parts)
1665 int m_SyncParts03; //synchronization for already built parts (+31 parts)
1666 int m_InteractedPartId; //construction part id that an action was performed on
1667 int m_PerformedActionId; //action id that was performed on a construction part
1668
1669 //Sounds
1670 //build
1671 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
1672 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
1673 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
1674 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
1675 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
1676 //dismantle
1677 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
1678 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
1679 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
1680 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
1681 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
1682
1683 protected EffectSound m_Sound;
1684
1688
1689 // Constructor
1690 void BaseBuildingBase()
1691 {
1693
1694 //synchronized variables
1695 RegisterNetSyncVariableInt( "m_SyncParts01" );
1696 RegisterNetSyncVariableInt( "m_SyncParts02" );
1697 RegisterNetSyncVariableInt( "m_SyncParts03" );
1698 RegisterNetSyncVariableInt( "m_InteractedPartId" );
1699 RegisterNetSyncVariableInt( "m_PerformedActionId" );
1700 RegisterNetSyncVariableBool( "m_HasBase" );
1701
1702 //Construction init
1704
1705 if (ConfigIsExisting("hybridAttachments"))
1706 {
1708 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
1709 }
1710 if (ConfigIsExisting("mountables"))
1711 {
1713 ConfigGetTextArray("mountables", m_Mountables);
1714 }
1715
1716 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
1717 }
1718
1719 override void EEDelete(EntityAI parent)
1720 {
1721 super.EEDelete(parent);
1722
1723 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
1724 {
1725 areaDamage.Destroy();
1726 }
1727
1728 }
1729
1730 override string GetInvulnerabilityTypeString()
1731 {
1732 return "disableBaseDamage";
1733 }
1734
1735 override bool CanObstruct()
1736 {
1737 return true;
1738 }
1739
1740 override int GetHideIconMask()
1741 {
1742 return EInventoryIconVisibility.HIDE_VICINITY;
1743 }
1744
1745 // --- SYNCHRONIZATION
1747 {
1748 if ( GetGame().IsServer() )
1749 {
1750 SetSynchDirty();
1751 }
1752 }
1753
1754 override void OnVariablesSynchronized()
1755 {
1756 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
1757 super.OnVariablesSynchronized();
1758
1760 }
1761
1762 protected void OnSynchronizedClient()
1763 {
1764 //update parts
1766
1767 //update action on part
1769
1770 //update visuals (client)
1771 UpdateVisuals();
1772 }
1773
1774 //parts synchronization
1775 void RegisterPartForSync( int part_id )
1776 {
1777 //part_id must starts from index = 1
1778 int offset;
1779 int mask;
1780
1781 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
1782 {
1783 offset = part_id - 1;
1784 mask = 1 << offset;
1785
1786 m_SyncParts01 = m_SyncParts01 | mask;
1787 }
1788 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
1789 {
1790 offset = ( part_id % 32 );
1791 mask = 1 << offset;
1792
1793 m_SyncParts02 = m_SyncParts02 | mask;
1794 }
1795 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
1796 {
1797 offset = ( part_id % 63 );
1798 mask = 1 << offset;
1799
1800 m_SyncParts03 = m_SyncParts03 | mask;
1801 }
1802 }
1803
1804 void UnregisterPartForSync( int part_id )
1805 {
1806 //part_id must starts from index = 1
1807 int offset;
1808 int mask;
1809
1810 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
1811 {
1812 offset = part_id - 1;
1813 mask = 1 << offset;
1814
1815 m_SyncParts01 = m_SyncParts01 & ~mask;
1816 }
1817 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
1818 {
1819 offset = ( part_id % 32 );
1820 mask = 1 << offset;
1821
1822 m_SyncParts02 = m_SyncParts02 & ~mask;
1823 }
1824 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
1825 {
1826 offset = ( part_id % 63 );
1827 mask = 1 << offset;
1828
1829 m_SyncParts03 = m_SyncParts03 & ~mask;
1830 }
1831 }
1832
1833 bool IsPartBuildInSyncData( int part_id )
1834 {
1835 //part_id must starts from index = 1
1836 int offset;
1837 int mask;
1838
1839 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
1840 {
1841 offset = part_id - 1;
1842 mask = 1 << offset;
1843
1844 if ( ( m_SyncParts01 & mask ) > 0 )
1845 {
1846 return true;
1847 }
1848 }
1849 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
1850 {
1851 offset = ( part_id % 32 );
1852 mask = 1 << offset;
1853
1854 if ( ( m_SyncParts02 & mask ) > 0 )
1855 {
1856 return true;
1857 }
1858 }
1859 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
1860 {
1861 offset = ( part_id % 63 );
1862 mask = 1 << offset;
1863
1864 if ( ( m_SyncParts03 & mask ) > 0 )
1865 {
1866 return true;
1867 }
1868 }
1869
1870 return false;
1871 }
1872
1873 protected void RegisterActionForSync( int part_id, int action_id )
1874 {
1875 m_InteractedPartId = part_id;
1876 m_PerformedActionId = action_id;
1877 }
1878
1879 protected void ResetActionSyncData()
1880 {
1881 //reset data
1882 m_InteractedPartId = -1;
1884 }
1885
1886 protected void SetActionFromSyncData()
1887 {
1888 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
1889 {
1891 int build_action_id = m_PerformedActionId;
1892
1893 switch( build_action_id )
1894 {
1895 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
1896 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
1897 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
1898 }
1899 }
1900 }
1901 //------
1902
1904 {
1905 string key = part.m_PartName;
1906 bool is_base = part.IsBase();
1907 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
1908 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
1909 if ( is_part_built_sync )
1910 {
1911 if ( !part.IsBuilt() )
1912 {
1913 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
1914 GetConstruction().AddToConstructedParts( key );
1915 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
1916
1917 if (is_base)
1918 {
1920 RemoveProxyPhysics( ANIMATION_DEPLOYED );
1921 }
1922 }
1923 }
1924 else
1925 {
1926 if ( part.IsBuilt() )
1927 {
1928 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
1929 GetConstruction().RemoveFromConstructedParts( key );
1930 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
1931
1932 if (is_base)
1933 {
1935 AddProxyPhysics( ANIMATION_DEPLOYED );
1936 }
1937 }
1938 }
1939
1940 //check slot lock for material attachments
1941 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
1942 }
1943
1944 //set construction parts based on synchronized data
1946 {
1947 Construction construction = GetConstruction();
1948 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
1949
1950 for ( int i = 0; i < construction_parts.Count(); ++i )
1951 {
1952 string key = construction_parts.GetKey( i );
1953 ConstructionPart value = construction_parts.Get( key );
1954 SetPartFromSyncData(value);
1955 }
1956
1957 //regenerate navmesh
1958 UpdateNavmesh();
1959 }
1960
1961 protected ConstructionPart GetConstructionPartById( int id )
1962 {
1963 Construction construction = GetConstruction();
1964 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
1965
1966 for ( int i = 0; i < construction_parts.Count(); ++i )
1967 {
1968 string key = construction_parts.GetKey( i );
1969 ConstructionPart value = construction_parts.Get( key );
1970
1971 if ( value.GetId() == id )
1972 {
1973 return value;
1974 }
1975 }
1976
1977 return NULL;
1978 }
1979 //
1980
1981 //Base
1982 bool HasBase()
1983 {
1984 return m_HasBase;
1985 }
1986
1987 void SetBaseState( bool has_base )
1988 {
1989 m_HasBase = has_base;
1990 }
1991
1992 override bool IsDeployable()
1993 {
1994 return true;
1995 }
1996
1997 bool IsOpened()
1998 {
1999 return false;
2000 }
2001
2002 //--- CONSTRUCTION KIT
2004 {
2005 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
2006 if ( m_ConstructionKitHealth > 0 )
2007 {
2008 construction_kit.SetHealth( m_ConstructionKitHealth );
2009 }
2010
2011 return construction_kit;
2012 }
2013
2014 void CreateConstructionKitInHands(notnull PlayerBase player)
2015 {
2016 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
2017 if ( m_ConstructionKitHealth > 0 )
2018 {
2019 construction_kit.SetHealth( m_ConstructionKitHealth );
2020 }
2021 }
2022
2023 protected vector GetKitSpawnPosition()
2024 {
2025 return GetPosition();
2026 }
2027
2028 protected string GetConstructionKitType()
2029 {
2030 return "";
2031 }
2032
2033 void DestroyConstructionKit( ItemBase construction_kit )
2034 {
2035 m_ConstructionKitHealth = construction_kit.GetHealth();
2036 GetGame().ObjectDelete( construction_kit );
2037 }
2038
2039 //--- CONSTRUCTION
2040 void DestroyConstruction()
2041 {
2042 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
2043 GetGame().ObjectDelete( this );
2044 }
2045
2046 // --- EVENTS
2047 override void OnStoreSave( ParamsWriteContext ctx )
2048 {
2049 super.OnStoreSave( ctx );
2050
2051 //sync parts 01
2052 ctx.Write( m_SyncParts01 );
2053 ctx.Write( m_SyncParts02 );
2054 ctx.Write( m_SyncParts03 );
2055
2056 ctx.Write( m_HasBase );
2057 }
2058
2059 override bool OnStoreLoad( ParamsReadContext ctx, int version )
2060 {
2061 if ( !super.OnStoreLoad( ctx, version ) )
2062 return false;
2063
2064 //--- Base building data ---
2065 //Restore synced parts data
2066 if ( !ctx.Read( m_SyncParts01 ) )
2067 {
2068 m_SyncParts01 = 0; //set default
2069 return false;
2070 }
2071 if ( !ctx.Read( m_SyncParts02 ) )
2072 {
2073 m_SyncParts02 = 0; //set default
2074 return false;
2075 }
2076 if ( !ctx.Read( m_SyncParts03 ) )
2077 {
2078 m_SyncParts03 = 0; //set default
2079 return false;
2080 }
2081
2082 //has base
2083 if ( !ctx.Read( m_HasBase ) )
2084 {
2085 m_HasBase = false;
2086 return false;
2087 }
2088 //---
2089
2090 return true;
2091 }
2092
2093 override void AfterStoreLoad()
2094 {
2095 super.AfterStoreLoad();
2096
2098 {
2100 }
2101 }
2102
2104 {
2105 //update server data
2107
2108 //set base state
2109 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
2110 SetBaseState( construction_part.IsBuilt() ) ;
2111
2112 //synchronize after load
2114 }
2115
2116 override void OnCreatePhysics()
2117 {
2118 super.OnCreatePhysics();
2121 }
2122
2123 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2124 {
2126 return;
2127
2128 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2129
2130 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
2131 return;
2132
2133 Construction construction = GetConstruction();
2134 string part_name = zone;
2135 part_name.ToLower();
2136
2137 if ( newLevel == GameConstants.STATE_RUINED )
2138 {
2139 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2140
2141 if ( construction_part && construction.IsPartConstructed( part_name ) )
2142 {
2143 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
2144 construction.DestroyConnectedParts(part_name);
2145 }
2146
2147 //barbed wire handling (hack-ish)
2148 if ( part_name.Contains("barbed") )
2149 {
2150 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2151 if (barbed_wire)
2152 barbed_wire.SetMountedState( false );
2153 }
2154 }
2155 }
2156
2157 override void EEOnAfterLoad()
2158 {
2160 {
2162 }
2163
2164 super.EEOnAfterLoad();
2165 }
2166
2167 override void EEInit()
2168 {
2169 super.EEInit();
2170
2171 // init visuals and physics
2172 InitBaseState();
2173
2174 //debug
2175 #ifdef DEVELOPER
2177 #endif
2178 }
2179
2180 override void EEItemAttached( EntityAI item, string slot_name )
2181 {
2182 super.EEItemAttached( item, slot_name );
2183
2184 CheckForHybridAttachments( item, slot_name );
2185 UpdateVisuals();
2186 UpdateAttachmentPhysics( slot_name, false );
2187 }
2188
2189 override void EEItemDetached( EntityAI item, string slot_name )
2190 {
2191 super.EEItemDetached( item, slot_name );
2192
2193 UpdateVisuals();
2194 UpdateAttachmentPhysics( slot_name, false );
2195 }
2196
2197 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
2198 {
2199 string slot_name = InventorySlots.GetSlotName( slotId );
2200 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
2201
2202 UpdateAttachmentVisuals( slot_name, locked );
2203 UpdateAttachmentPhysics( slot_name, locked );
2204 }
2205
2206 //ignore out of reach condition
2207 override bool IgnoreOutOfReachCondition()
2208 {
2209 return true;
2210 }
2211
2212 //CONSTRUCTION EVENTS
2213 //Build
2214 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
2215 {
2216 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2217
2218 //check base state
2219 if (construtionPart.IsBase())
2220 {
2221 SetBaseState(true);
2222
2223 //spawn kit
2225 }
2226
2227 //register constructed parts for synchronization
2228 RegisterPartForSync(construtionPart.GetId());
2229
2230 //register action that was performed on part
2231 RegisterActionForSync(construtionPart.GetId(), action_id);
2232
2233 //synchronize
2235
2236 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
2237
2238 UpdateNavmesh();
2239
2240 //update visuals
2241 UpdateVisuals();
2242
2243 //reset action sync data
2245 }
2246
2247 void OnPartBuiltClient(string part_name, int action_id)
2248 {
2249 //play sound
2250 SoundBuildStart( part_name );
2251 }
2252
2253 //Dismantle
2254 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
2255 {
2256 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
2257 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2258
2259 //register constructed parts for synchronization
2260 UnregisterPartForSync(construtionPart.GetId());
2261
2262 //register action that was performed on part
2263 RegisterActionForSync(construtionPart.GetId(), action_id);
2264
2265 //synchronize
2267
2268 // server part of sync, client will be synced from SetPartsFromSyncData
2269 SetPartFromSyncData(construtionPart);
2270
2271 UpdateNavmesh();
2272
2273 //update visuals
2274 UpdateVisuals();
2275
2276 //reset action sync data
2278
2279 //check base state
2280 if (construtionPart.IsBase())
2281 {
2282 //Destroy construction
2284 }
2285
2286 if (GetGame().IsServer())
2287 HandleItemFalling(construtionPart);
2288 }
2289
2290 void OnPartDismantledClient( string part_name, int action_id )
2291 {
2292 //play sound
2293 SoundDismantleStart( part_name );
2294 }
2295
2296 //Destroy
2297 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
2298 {
2299 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
2300 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
2301
2302 //register constructed parts for synchronization
2303 UnregisterPartForSync(construtionPart.GetId());
2304
2305 //register action that was performed on part
2306 RegisterActionForSync(construtionPart.GetId(), action_id);
2307
2308 //synchronize
2310
2311 // server part of sync, client will be synced from SetPartsFromSyncData
2312 SetPartFromSyncData(construtionPart);
2313
2314 UpdateNavmesh();
2315
2316 //update visuals
2317 UpdateVisuals();
2318
2319 //reset action sync data
2321
2322 //check base state
2323 if (construtionPart.IsBase())
2324 {
2325 //Destroy construction
2327 }
2328
2329 if (GetGame().IsServer())
2330 HandleItemFalling(construtionPart);
2331 }
2332
2333 void OnPartDestroyedClient( string part_name, int action_id )
2334 {
2335 //play sound
2336 SoundDestroyStart( part_name );
2337 }
2338
2339 protected void HandleItemFalling(ConstructionPart part)
2340 {
2341 bool process = false;
2342
2343 //TODO: add a parameter to parts' config classes?
2344 process |= part.m_PartName.Contains("_roof");
2345 process |= part.m_PartName.Contains("_platform");
2346 process |= part.m_PartName.Contains("_stair");
2347
2348 if (process)
2349 {
2350 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
2351 {
2352 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
2353 return;
2354 }
2355
2356 vector mins, maxs;
2357 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
2358 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
2359
2360 //sanitize minmaxs
2361 vector minTmp, maxTmp;
2362 minTmp[0] = Math.Min(mins[0],maxs[0]);
2363 maxTmp[0] = Math.Max(mins[0],maxs[0]);
2364 minTmp[1] = Math.Min(mins[1],maxs[1]);
2365 maxTmp[1] = Math.Max(mins[1],maxs[1]);
2366 minTmp[2] = Math.Min(mins[2],maxs[2]);
2367 maxTmp[2] = Math.Max(mins[2],maxs[2]);
2368 mins = minTmp;
2369 maxs = maxTmp;
2370
2371 maxs[1] = maxs[1] + 0.35; //reach a little above..
2372
2373 ItemFall(mins,maxs);
2374 }
2375 }
2376
2377 protected void ItemFall(vector min, vector max)
2378 {
2379 array<EntityAI> foundEntities = new array<EntityAI>();
2380 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
2381
2382 //filtering
2383 ItemBase item;
2384 foreach (EntityAI entity : foundEntities)
2385 {
2386 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
2387 item.ThrowPhysically(null,vector.Zero);
2388 }
2389 }
2390
2391 // --- UPDATE
2392 void InitBaseState()
2393 {
2394 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
2395
2396 InitVisuals();
2397 UpdateNavmesh(); //regenerate navmesh
2398 GetConstruction().InitBaseState();
2399 }
2400
2401 void InitVisuals()
2402 {
2403 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
2404 //check base
2405 if ( !HasBase() )
2406 {
2407 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
2408 }
2409 else
2410 {
2411 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
2412 }
2413
2414 GetConstruction().UpdateVisuals();
2415 }
2416
2417 void UpdateVisuals()
2418 {
2419 array<string> attachmentSlots = new array<string>;
2420
2421 GetAttachmentSlots(this, attachmentSlots);
2422 foreach (string slotName : attachmentSlots)
2423 {
2425 }
2426
2427 //check base
2428 if (!HasBase())
2429 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
2430 else
2431 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
2432
2433 GetConstruction().UpdateVisuals();
2434 }
2435
2436 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
2437 {
2438 string slotNameMounted = slot_name + "_Mounted";
2439 EntityAI attachment = FindAttachmentBySlotName(slot_name);
2440
2441 if (attachment)
2442 {
2443 BarbedWire barbedWire = BarbedWire.Cast(attachment);
2444 if (barbedWire && barbedWire.IsMounted())
2445 CreateAreaDamage(slotNameMounted);
2446 else
2447 DestroyAreaDamage(slotNameMounted);
2448
2449 if (is_locked)
2450 {
2451 SetAnimationPhase(slotNameMounted, 0);
2452 SetAnimationPhase(slot_name, 1);
2453 }
2454 else
2455 {
2456 SetAnimationPhase(slotNameMounted, 1);
2457 SetAnimationPhase(slot_name, 0);
2458 }
2459 }
2460 else
2461 {
2462 SetAnimationPhase(slotNameMounted, 1);
2463 SetAnimationPhase(slot_name, 1);
2464
2465 DestroyAreaDamage(slotNameMounted);
2466 }
2467 }
2468
2469 // avoid calling this function on frequent occasions, it's a massive performance hit
2470 void UpdatePhysics()
2471 {
2473 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
2474
2475 array<string> attachmentSlots = new array<string>;
2476 GetAttachmentSlots(this, attachmentSlots);
2477
2479 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
2480
2481 foreach (string slotName : attachmentSlots)
2482 {
2484 }
2485
2486 //check base
2487 if (!HasBase())
2488 {
2490 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
2491
2492 AddProxyPhysics(ANIMATION_DEPLOYED);
2493 }
2494 else
2495 {
2497 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
2498
2499 RemoveProxyPhysics(ANIMATION_DEPLOYED);
2500 }
2501
2502 GetConstruction().UpdatePhysics();
2503 UpdateNavmesh();
2504 }
2505
2506 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
2507 {
2508 //checks for invalid appends; hotfix
2509 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
2510 return;
2511 //----------------------------------
2512 string slot_name_mounted = slot_name + "_Mounted";
2513 EntityAI attachment = FindAttachmentBySlotName( slot_name );
2514
2515 //remove proxy physics
2516 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
2517 RemoveProxyPhysics( slot_name_mounted );
2518 RemoveProxyPhysics( slot_name );
2519
2520 if ( attachment )
2521 {
2522 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
2523 if ( is_locked )
2524 {
2525 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
2526 AddProxyPhysics( slot_name_mounted );
2527 }
2528 else
2529 {
2530 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
2531 AddProxyPhysics( slot_name );
2532 }
2533 }
2534 }
2535
2536 protected void UpdateNavmesh()
2537 {
2538 SetAffectPathgraph( true, false );
2539 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
2540 }
2541
2542 override bool CanUseConstruction()
2543 {
2544 return true;
2545 }
2546
2547 override bool CanUseConstructionBuild()
2548 {
2549 return true;
2550 }
2551
2552 protected bool IsAttachmentSlotLocked( EntityAI attachment )
2553 {
2554 if ( attachment )
2555 {
2556 InventoryLocation inventory_location = new InventoryLocation;
2557 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
2558
2559 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
2560 }
2561
2562 return false;
2563 }
2564
2565 protected bool IsAttachmentSlotLocked( string slot_name )
2566 {
2567 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
2568 }
2569
2570 //--- ATTACHMENT SLOTS
2571 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
2572 {
2573 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
2574 if ( GetGame().ConfigIsExisting( config_path ) )
2575 {
2576 GetGame().ConfigGetTextArray( config_path, attachment_slots );
2577 }
2578 }
2579
2580 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
2581 {
2582 return true;
2583 }
2584
2585 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
2586 {
2587 return true;
2588 }
2589
2590 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
2591 {
2592 return true;
2593 }
2594
2595 // --- INIT
2596 void ConstructionInit()
2597 {
2598 if ( !m_Construction )
2599 {
2600 m_Construction = new Construction( this );
2601 }
2602
2603 GetConstruction().Init();
2604 }
2605
2607 {
2608 return m_Construction;
2609 }
2610
2611 //--- INVENTORY/ATTACHMENTS CONDITIONS
2612 //attachments
2613 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
2614 {
2615 return super.CanReceiveAttachment(attachment, slotId);
2616 }
2617
2619 {
2620 int attachment_count = GetInventory().AttachmentCount();
2621 if ( attachment_count > 0 )
2622 {
2623 if ( HasBase() && attachment_count == 1 )
2624 {
2625 return false;
2626 }
2627
2628 return true;
2629 }
2630
2631 return false;
2632 }
2633
2634 override bool ShowZonesHealth()
2635 {
2636 return true;
2637 }
2638
2639 override bool IsTakeable()
2640 {
2641 return false;
2642 }
2643
2644 //this into/outo parent.Cargo
2645 override bool CanPutInCargo( EntityAI parent )
2646 {
2647 return false;
2648 }
2649
2650 override bool CanRemoveFromCargo( EntityAI parent )
2651 {
2652 return false;
2653 }
2654
2655 //hands
2656 override bool CanPutIntoHands( EntityAI parent )
2657 {
2658 return false;
2659 }
2660
2661 //--- ACTION CONDITIONS
2662 //direction
2663 override bool IsFacingPlayer( PlayerBase player, string selection )
2664 {
2665 return true;
2666 }
2667
2668 override bool IsPlayerInside( PlayerBase player, string selection )
2669 {
2670 return true;
2671 }
2672
2675 {
2676 return false;
2677 }
2678
2679 //camera direction check
2680 bool IsFacingCamera( string selection )
2681 {
2682 return true;
2683 }
2684
2685 //roof check
2686 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
2687 {
2688 return false;
2689 }
2690
2691 //selection->player distance check
2692 bool HasProperDistance( string selection, PlayerBase player )
2693 {
2694 return true;
2695 }
2696
2697 //folding
2699 {
2700 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
2701 {
2702 return false;
2703 }
2704
2705 return true;
2706 }
2707
2709 {
2712
2713 return item;
2714 }
2715
2716 //Damage triggers (barbed wire)
2717 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
2718 {
2719 if ( GetGame() && GetGame().IsServer() )
2720 {
2721 //destroy area damage if some already exists
2722 DestroyAreaDamage( slot_name );
2723
2724 //create new area damage
2726 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
2727
2728 vector min_max[2];
2729 if ( MemoryPointExists( slot_name + "_min" ) )
2730 {
2731 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
2732 }
2733 if ( MemoryPointExists( slot_name + "_max" ) )
2734 {
2735 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
2736 }
2737
2738 //get proper trigger extents (min<max)
2739 vector extents[2];
2740 GetConstruction().GetTriggerExtents( min_max, extents );
2741
2742 //get box center
2743 vector center;
2744 center = GetConstruction().GetBoxCenter( min_max );
2745 center = ModelToWorld( center );
2746
2747 //rotate center if needed
2748 vector orientation = GetOrientation();;
2749 CalcDamageAreaRotation( rotation_angle, center, orientation );
2750
2751 areaDamage.SetExtents( extents[0], extents[1] );
2752 areaDamage.SetAreaPosition( center );
2753 areaDamage.SetAreaOrientation( orientation );
2754 areaDamage.SetLoopInterval( 1.0 );
2755 areaDamage.SetDeferDuration( 0.2 );
2756 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
2757 areaDamage.SetAmmoName( "BarbedWireHit" );
2758 areaDamage.Spawn();
2759
2760 m_DamageTriggers.Insert( slot_name, areaDamage );
2761 }
2762 }
2763
2764 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
2765 {
2766 if ( angle_deg != 0 )
2767 {
2768 //orientation
2769 orientation[0] = orientation[0] - angle_deg;
2770
2771 //center
2772 vector rotate_axis;
2773 if ( MemoryPointExists( "rotate_axis" ) )
2774 {
2775 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
2776 }
2777 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];
2778 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];
2779 center[0] = r_center_x;
2780 center[2] = r_center_z;
2781 }
2782 }
2783
2784 void DestroyAreaDamage( string slot_name )
2785 {
2786 if (GetGame() && GetGame().IsServer())
2787 {
2789 if (m_DamageTriggers.Find(slot_name, areaDamage))
2790 {
2791 if (areaDamage)
2792 {
2793 areaDamage.Destroy();
2794 }
2795
2796 m_DamageTriggers.Remove( slot_name );
2797 }
2798 }
2799 }
2800
2801 override bool IsIgnoredByConstruction()
2802 {
2803 return true;
2804 }
2805
2806 //================================================================
2807 // SOUNDS
2808 //================================================================
2809 protected void SoundBuildStart( string part_name )
2810 {
2811 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
2812 }
2813
2814 protected void SoundDismantleStart( string part_name )
2815 {
2816 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
2817 }
2818
2819 protected void SoundDestroyStart( string part_name )
2820 {
2821 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
2822 }
2823
2824 protected string GetBuildSoundByMaterial( string part_name )
2825 {
2826 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
2827
2828 switch ( material_type )
2829 {
2830 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
2831 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
2832 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
2833 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
2834 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
2835 }
2836
2837 return "";
2838 }
2839
2840 protected string GetDismantleSoundByMaterial( string part_name )
2841 {
2842 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
2843
2844 switch ( material_type )
2845 {
2846 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
2847 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
2848 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
2849 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
2850 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
2851 }
2852
2853 return "";
2854 }
2855
2856 //misc
2857 void CheckForHybridAttachments( EntityAI item, string slot_name )
2858 {
2859 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
2860 {
2861 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
2862 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
2863 {
2864 SetHealth(slot_name,"Health",item.GetHealth());
2865 }
2866 }
2867 }
2868
2869 override int GetDamageSystemVersionChange()
2870 {
2871 return 111;
2872 }
2873
2874 override void SetActions()
2875 {
2876 super.SetActions();
2877
2881 }
2882
2883 //================================================================
2884 // DEBUG
2885 //================================================================
2886 protected void DebugCustomState()
2887 {
2888 }
2889
2892 {
2893 return null;
2894 }
2895
2896 override void OnDebugSpawn()
2897 {
2898 FullyBuild();
2899 }
2900
2901 void FullyBuild()
2902 {
2904 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
2905
2906 Man p;
2907
2908 #ifdef SERVER
2909 array<Man> players = new array<Man>;
2910 GetGame().GetWorld().GetPlayerList(players);
2911 if (players.Count())
2912 p = players[0];
2913 #else
2914 p = GetGame().GetPlayer();
2915 #endif
2916
2917 foreach (ConstructionPart part : parts)
2918 {
2919 bool excluded = false;
2920 string partName = part.GetPartName();
2921 if (excludes)
2922 {
2923 foreach (string exclude : excludes)
2924 {
2925 if (partName.Contains(exclude))
2926 {
2927 excluded = true;
2928 break;
2929 }
2930 }
2931 }
2932
2933 if (!excluded)
2934 {
2935 OnPartBuiltServer(p, partName, AT_BUILD_PART);
2936 }
2937 }
2938
2939 GetConstruction().UpdateVisuals();
2940 }
2941}
2942
2943void bsbDebugPrint (string s)
2944{
2945#ifdef BSB_DEBUG
2946 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
2947#else
2948 //Print("" + s); // comment/uncomment to hide/see debug logs
2949#endif
2950}
2951void bsbDebugSpam (string s)
2952{
2953#ifdef BSB_DEBUG_SPAM
2954 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
2955#else
2956 //Print("" + s); // comment/uncomment to hide/see debug logs
2957#endif
2958}
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