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

◆ SetBaseState()

void bsbDebugPrint::SetBaseState ( bool has_base)
protected

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

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

Используется в TerritoryFlag::FullyBuild(), ItemBase::OnPartBuiltServer() и ItemBase::SetPartsAfterStoreLoad().