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

◆ OnStoreSave()

override void bsbDebugPrint::OnStoreSave ( ParamsWriteContext ctx)
protected

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

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