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

◆ DestroyConstruction()

void bsbDebugPrint::DestroyConstruction ( )
protected

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

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

Используется в ItemBase::FoldBaseBuildingObject().