1446{
1448
1450
1452
1454
1460
1461
1462
1468
1474
1476
1480
1481
1483 {
1485
1486
1487 RegisterNetSyncVariableInt( "m_SyncParts01" );
1488 RegisterNetSyncVariableInt( "m_SyncParts02" );
1489 RegisterNetSyncVariableInt( "m_SyncParts03" );
1490 RegisterNetSyncVariableInt( "m_InteractedPartId" );
1491 RegisterNetSyncVariableInt( "m_PerformedActionId" );
1492 RegisterNetSyncVariableBool( "m_HasBase" );
1493
1494
1496
1497 if (ConfigIsExisting("hybridAttachments"))
1498 {
1501 }
1502 if (ConfigIsExisting("mountables"))
1503 {
1506 }
1507
1509 }
1510
1512 {
1513 super.EEDelete(parent);
1514
1516 {
1517 areaDamage.Destroy();
1518 }
1519
1520 }
1521
1523 {
1524 return "disableBaseDamage";
1525 }
1526
1528 {
1529 return true;
1530 }
1531
1533 {
1534 return EInventoryIconVisibility.HIDE_VICINITY;
1535 }
1536
1538 {
1539 super.InitItemSounds();
1540
1544
1549 }
1550
1552 {
1553 return "putDown_FenceKit_SoundSet";
1554 }
1555
1557 {
1558 return "Shelter_Site_Build_Loop_SoundSet";
1559 }
1560
1561
1563 {
1565 {
1566 SetSynchDirty();
1567 }
1568 }
1569
1571 {
1573 super.OnVariablesSynchronized();
1574
1576 }
1577
1579 {
1580
1582
1583
1585
1586
1588 }
1589
1590
1592 {
1593
1594 int offset;
1595 int mask;
1596
1597 if ( part_id >= 1 && part_id <= 31 )
1598 {
1599 offset = part_id - 1;
1600 mask = 1 << offset;
1601
1603 }
1604 else if ( part_id >= 32 && part_id <= 62 )
1605 {
1606 offset = ( part_id % 32 );
1607 mask = 1 << offset;
1608
1610 }
1611 else if ( part_id >= 63 && part_id <= 93 )
1612 {
1613 offset = ( part_id % 63 );
1614 mask = 1 << offset;
1615
1617 }
1618 }
1619
1621 {
1622
1623 int offset;
1624 int mask;
1625
1626 if ( part_id >= 1 && part_id <= 31 )
1627 {
1628 offset = part_id - 1;
1629 mask = 1 << offset;
1630
1632 }
1633 else if ( part_id >= 32 && part_id <= 62 )
1634 {
1635 offset = ( part_id % 32 );
1636 mask = 1 << offset;
1637
1639 }
1640 else if ( part_id >= 63 && part_id <= 93 )
1641 {
1642 offset = ( part_id % 63 );
1643 mask = 1 << offset;
1644
1646 }
1647 }
1648
1650 {
1651
1652 int offset;
1653 int mask;
1654
1655 if ( part_id >= 1 && part_id <= 31 )
1656 {
1657 offset = part_id - 1;
1658 mask = 1 << offset;
1659
1661 {
1662 return true;
1663 }
1664 }
1665 else if ( part_id >= 32 && part_id <= 62 )
1666 {
1667 offset = ( part_id % 32 );
1668 mask = 1 << offset;
1669
1671 {
1672 return true;
1673 }
1674 }
1675 else if ( part_id >= 63 && part_id <= 93 )
1676 {
1677 offset = ( part_id % 63 );
1678 mask = 1 << offset;
1679
1681 {
1682 return true;
1683 }
1684 }
1685
1686 return false;
1687 }
1688
1690 {
1693 }
1694
1696 {
1697
1700 }
1701
1703 {
1705 {
1708
1709 switch( build_action_id )
1710 {
1714 }
1715 }
1716 }
1717
1718
1720 {
1722 bool is_base = part.
IsBase();
1725 if ( is_part_built_sync )
1726 {
1728 {
1732
1733 if (is_base)
1734 {
1737 }
1738 }
1739 }
1740 else
1741 {
1743 {
1747
1748 if (is_base)
1749 {
1752 }
1753 }
1754 }
1755
1756
1758 }
1759
1760
1762 {
1765
1766 for ( int i = 0; i < construction_parts.Count(); ++i )
1767 {
1768 string key = construction_parts.GetKey( i );
1771 }
1772
1773
1775 }
1776
1778 {
1781
1782 for ( int i = 0; i < construction_parts.Count(); ++i )
1783 {
1784 string key = construction_parts.GetKey( i );
1786
1787 if ( value.
GetId() ==
id )
1788 {
1789 return value;
1790 }
1791 }
1792
1793 return NULL;
1794 }
1795
1796
1797
1799 {
1801 }
1802
1804 {
1806 }
1807
1809 {
1810 return true;
1811 }
1812
1814 {
1815 return false;
1816 }
1817
1818
1820 {
1823 {
1825 }
1826
1827 return construction_kit;
1828 }
1829
1831 {
1834 {
1836 }
1837 }
1838
1840 {
1842 }
1843
1845 {
1846 return "";
1847 }
1848
1850 {
1853 }
1854
1855
1857 {
1860 }
1861
1862
1864 {
1865 super.OnStoreSave( ctx );
1866
1867
1871
1873 }
1874
1876 {
1877 if ( !super.OnStoreLoad( ctx, version ) )
1878 return false;
1879
1880
1881
1883 {
1885 return false;
1886 }
1888 {
1890 return false;
1891 }
1893 {
1895 return false;
1896 }
1897
1898
1900 {
1902 return false;
1903 }
1904
1905
1906 return true;
1907 }
1908
1910 {
1911 super.AfterStoreLoad();
1912
1914 {
1916 }
1917 }
1918
1920 {
1921
1923
1924
1927
1928
1930 }
1931
1933 {
1934 super.OnCreatePhysics();
1937 }
1938
1940 {
1942 return;
1943
1944 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1945
1947 return;
1948
1950 string part_name = zone;
1952
1954 {
1955 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
1956
1957 if ( construction_part && construction.IsPartConstructed( part_name ) )
1958 {
1960 construction.DestroyConnectedParts(part_name);
1961 }
1962
1963
1964 if ( part_name.
Contains(
"barbed") )
1965 {
1966 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
1967 if (barbed_wire)
1968 barbed_wire.SetMountedState( false );
1969 }
1970 }
1971 }
1972
1974 {
1976 {
1978 }
1979
1980 super.EEOnAfterLoad();
1981 }
1982
1984 {
1985 super.EEInit();
1986
1987
1989
1990
1991 #ifdef DEVELOPER
1993 #endif
1994 }
1995
1997 {
1998 super.EEItemAttached( item, slot_name );
1999
2003 }
2004
2006 {
2007 super.EEItemDetached( item, slot_name );
2008
2011 }
2012
2013 protected void OnSetSlotLock(
int slotId,
bool locked,
bool was_locked )
2014 {
2017
2020 }
2021
2022
2024 {
2025 return true;
2026 }
2027
2028
2029
2031 {
2033
2034
2035 if (construtionPart.
IsBase())
2036 {
2038
2039
2041 }
2042
2043
2045
2046
2048
2049
2051
2053
2055
2056
2058
2059
2061 }
2062
2064 {
2065
2067 }
2068
2069
2071 {
2074
2075
2077
2078
2080
2081
2083
2084
2086
2088
2089
2091
2092
2094
2095
2096 if (construtionPart.
IsBase())
2097 {
2098
2100 }
2101 }
2102
2104 {
2105
2107 }
2108
2109
2110 void OnPartDestroyedServer(Man player,
string part_name,
int action_id,
bool destroyed_by_connected_part =
false)
2111 {
2114
2115
2117
2118
2120
2121
2123
2124
2126
2128
2129
2131
2132
2134
2135
2136 if (construtionPart.
IsBase())
2137 {
2138
2140 }
2141 }
2142
2144 {
2145
2147 }
2148
2151 {
2152 bool process = false;
2153
2154
2158
2159 if (process)
2160 {
2161 if (!MemoryPointExists(part.
m_PartName +
"_min") || !MemoryPointExists(part.
m_PartName +
"_max"))
2162 {
2164 return;
2165 }
2166
2168 mins = ModelToWorld(GetMemoryPointPos(part.
m_PartName +
"_min"));
2169 maxs = ModelToWorld(GetMemoryPointPos(part.
m_PartName +
"_max"));
2170
2171
2173 minTmp[0] =
Math.
Min(mins[0],maxs[0]);
2174 maxTmp[0] =
Math.
Max(mins[0],maxs[0]);
2175 minTmp[1] =
Math.
Min(mins[1],maxs[1]);
2176 maxTmp[1] =
Math.
Max(mins[1],maxs[1]);
2177 minTmp[2] =
Math.
Min(mins[2],maxs[2]);
2178 maxTmp[2] =
Math.
Max(mins[2],maxs[2]);
2179 mins = minTmp;
2180 maxs = maxTmp;
2181
2182 maxs[1] = maxs[1] + 0.35;
2183
2185 }
2186 }
2187
2190 {
2193
2194
2196 foreach (
EntityAI entity : foundEntities)
2197 {
2200 }
2201 }
2202
2203
2205 {
2207
2211 }
2212
2214 {
2216
2218 {
2220 }
2221 else
2222 {
2224 }
2225
2227 }
2228
2230 {
2232
2234 foreach (
string slotName : attachmentSlots)
2235 {
2237 }
2238
2239
2242 else
2244
2246 }
2247
2249 {
2250 string slotNameMounted = slot_name + "_Mounted";
2251 EntityAI attachment = FindAttachmentBySlotName(slot_name);
2252
2253 if (attachment)
2254 {
2255 BarbedWire barbedWire = BarbedWire.Cast(attachment);
2256 if (barbedWire && barbedWire.IsMounted())
2258 else
2260
2261 if (is_locked)
2262 {
2263 SetAnimationPhase(slotNameMounted, 0);
2264 SetAnimationPhase(slot_name, 1);
2265 }
2266 else
2267 {
2268 SetAnimationPhase(slotNameMounted, 1);
2269 SetAnimationPhase(slot_name, 0);
2270 }
2271 }
2272 else
2273 {
2274 SetAnimationPhase(slotNameMounted, 1);
2275 SetAnimationPhase(slot_name, 1);
2276
2278 }
2279 }
2280
2281
2283 {
2286
2289
2292
2293 foreach (
string slotName : attachmentSlots)
2294 {
2296 }
2297
2298
2300 {
2303
2305 }
2306 else
2307 {
2310
2312 }
2313
2316 }
2317
2319 {
2320
2322 return;
2323
2324 string slot_name_mounted = slot_name + "_Mounted";
2325 EntityAI attachment = FindAttachmentBySlotName( slot_name );
2326
2327
2329 RemoveProxyPhysics( slot_name_mounted );
2330 RemoveProxyPhysics( slot_name );
2331
2332 if ( attachment )
2333 {
2335 if ( is_locked )
2336 {
2338 AddProxyPhysics( slot_name_mounted );
2339 }
2340 else
2341 {
2343 AddProxyPhysics( slot_name );
2344 }
2345 }
2346 }
2347
2349 {
2350 SetAffectPathgraph( true, false );
2352 }
2353
2355 {
2356 return true;
2357 }
2358
2360 {
2361 return true;
2362 }
2363
2365 {
2366 if ( attachment )
2367 {
2369 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
2370
2371 return GetInventory().GetSlotLock( inventory_location.
GetSlot() );
2372 }
2373
2374 return false;
2375 }
2376
2378 {
2380 }
2381
2382
2384 {
2385 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
2386 if (
GetGame().ConfigIsExisting( config_path ) )
2387 {
2389 }
2390 }
2391
2393 {
2394 return true;
2395 }
2396
2398 {
2399 return true;
2400 }
2401
2403 {
2404 return true;
2405 }
2406
2407
2409 {
2411 {
2413 }
2414
2416 }
2417
2419 {
2421 }
2422
2423
2424
2426 {
2427 return super.CanReceiveAttachment(attachment, slotId);
2428 }
2429
2431 {
2432 int attachment_count = GetInventory().AttachmentCount();
2433 if ( attachment_count > 0 )
2434 {
2435 if (
HasBase() && attachment_count == 1 )
2436 {
2437 return false;
2438 }
2439
2440 return true;
2441 }
2442
2443 return false;
2444 }
2445
2447 {
2448 return true;
2449 }
2450
2452 {
2453 return false;
2454 }
2455
2456
2458 {
2459 return false;
2460 }
2461
2463 {
2464 return false;
2465 }
2466
2467
2469 {
2470 return false;
2471 }
2472
2473
2474
2476 {
2477 return true;
2478 }
2479
2481 {
2482 return true;
2483 }
2484
2487 {
2488 return false;
2489 }
2490
2491
2493 {
2494 return true;
2495 }
2496
2497
2499 {
2500 return false;
2501 }
2502
2503
2505 {
2506 return true;
2507 }
2508
2509
2511 {
2512 if (
HasBase() || GetInventory().AttachmentCount() > 0 )
2513 {
2514 return false;
2515 }
2516
2517 return true;
2518 }
2519
2521 {
2524
2525 return item;
2526 }
2527
2528
2530 {
2532 {
2533
2535
2536
2539
2541 if ( MemoryPointExists( slot_name + "_min" ) )
2542 {
2543 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
2544 }
2545 if ( MemoryPointExists( slot_name + "_max" ) )
2546 {
2547 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
2548 }
2549
2550
2553
2554
2557 center = ModelToWorld( center );
2558
2559
2562
2563 areaDamage.SetExtents( extents[0], extents[1] );
2564 areaDamage.SetAreaPosition( center );
2565 areaDamage.SetAreaOrientation( orientation );
2568 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
2569 areaDamage.SetAmmoName( "BarbedWireHit" );
2570 areaDamage.Spawn();
2571
2573 }
2574 }
2575
2577 {
2578 if ( angle_deg != 0 )
2579 {
2580
2581 orientation[0] = orientation[0] - angle_deg;
2582
2583
2585 if ( MemoryPointExists( "rotate_axis" ) )
2586 {
2587 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
2588 }
2589 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];
2590 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];
2591 center[0] = r_center_x;
2592 center[2] = r_center_z;
2593 }
2594 }
2595
2597 {
2599 {
2602 {
2603 if (areaDamage)
2604 {
2605 areaDamage.Destroy();
2606 }
2607
2609 }
2610 }
2611 }
2612
2614 {
2615 return true;
2616 }
2617
2618
2619
2620
2622 {
2624 }
2625
2627 {
2629 }
2630
2632 {
2634 }
2635
2637 {
2639
2640 switch ( material_type )
2641 {
2647 }
2648
2649 return "";
2650 }
2651
2653 {
2655
2656 switch ( material_type )
2657 {
2663 }
2664
2665 return "";
2666 }
2667
2668
2670 {
2672 {
2673
2675 {
2676 SetHealth(slot_name,"Health",item.GetHealth());
2677 }
2678 }
2679 }
2680
2682 {
2683 return 111;
2684 }
2685
2687 {
2688 super.SetActions();
2689
2693 }
2694
2695
2696
2697
2699 {
2700 }
2701
2704 {
2705 return null;
2706 }
2707
2709 {
2711 }
2712
2714 {
2717
2718 Man p;
2719
2720 #ifdef SERVER
2723 if (players.Count())
2724 p = players[0];
2725 #else
2727 #endif
2728
2730 {
2731 bool excluded = false;
2733 if (excludes)
2734 {
2735 foreach (string exclude : excludes)
2736 {
2738 {
2739 excluded = true;
2740 break;
2741 }
2742 }
2743 }
2744
2745 if (!excluded)
2746 {
2748 }
2749 }
2750
2752 }
2753}
2754
2756{
2757#ifdef BSB_DEBUG
2759#else
2760
2761#endif
2762}
2764{
2765#ifdef BSB_DEBUG_SPAM
2767#else
2768
2769#endif
2770}
const int AT_DISMANTLE_PART
const int AT_DESTROY_PART
void AddAction(typename actionName)
void RemoveAction(typename actionName)
void AreaDamageManager(EntityAI parent)
void OnPartDismantledClient(string part_name, int action_id)
const string ANIMATION_DEPLOYED
override int GetHideIconMask()
override void OnStoreSave(ParamsWriteContext ctx)
void SetActionFromSyncData()
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
override void OnDebugSpawn()
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
void SoundDestroyStart(string part_name)
const string SOUND_BUILD_WOOD_LOG
void SoundBuildStart(string part_name)
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
override bool CanObstruct()
bool HasAttachmentsBesidesBase()
override void InitItemSounds()
void RegisterPartForSync(int part_id)
const string SOUND_DISMANTLE_METAL
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
void SetPartsAfterStoreLoad()
void DestroyConstruction()
ref array< string > m_HybridAttachments
override string GetFoldSoundset()
string GetDismantleSoundByMaterial(string part_name)
bool IsAttachmentSlotLocked(EntityAI attachment)
override bool IsFacingPlayer(PlayerBase player, string selection)
void OnPartBuiltClient(string part_name, int action_id)
bool HasProperDistance(string selection, PlayerBase player)
override void OnCreatePhysics()
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
void RegisterActionForSync(int part_id, int action_id)
const string SOUND_BUILD_WOOD_PLANK
void SetPartsFromSyncData()
ref array< string > m_Mountables
const string SOUND_BUILD_WIRE
void ResetActionSyncData()
override string GetInvulnerabilityTypeString()
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
void CheckForHybridAttachments(EntityAI item, string slot_name)
override void EEOnAfterLoad()
override void EEItemDetached(EntityAI item, string slot_name)
vector GetKitSpawnPosition()
ref Construction m_Construction
bool IsFacingCamera(string selection)
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
override bool IsDeployable()
void OnPartDestroyedClient(string part_name, int action_id)
void UnregisterPartForSync(int part_id)
void bsbDebugSpam(string s)
override void OnVariablesSynchronized()
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Construction GetConstruction()
void SoundDismantleStart(string part_name)
ConstructionPart GetConstructionPartById(int id)
string GetConstructionKitType()
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
bool CanFoldBaseBuildingObject()
override int GetDamageSystemVersionChange()
const string SOUND_DISMANTLE_WOOD_PLANK
override void EEItemAttached(EntityAI item, string slot_name)
const string SOUND_DISMANTLE_WOOD_LOG
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
const string SOUND_BUILD_WOOD_STAIRS
ItemBase FoldBaseBuildingObject()
override bool CanPutInCargo(EntityAI parent)
override bool CanUseConstruction()
override void AfterStoreLoad()
void SetPartFromSyncData(ConstructionPart part)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override bool IgnoreOutOfReachCondition()
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override bool ShowZonesHealth()
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
override bool IsPlayerInside(PlayerBase player, string selection)
string GetBuildSoundByMaterial(string part_name)
ItemBase CreateConstructionKit()
const string SOUND_DISMANTLE_WIRE
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
override bool IsTakeable()
float m_ConstructionKitHealth
override void EEDelete(EntityAI parent)
override void SetActions()
void HandleItemFalling(ConstructionPart part)
Disconnected temporarily.
void DestroyConstructionKit(ItemBase construction_kit)
void CreateConstructionKitInHands(notnull PlayerBase player)
void ItemFall(vector min, vector max)
Disconnected temporarily.
override bool CanUseConstructionBuild()
void OnSynchronizedClient()
void SynchronizeBaseState()
override bool IsIgnoredByConstruction()
ref map< string, ref AreaDamageManager > m_DamageTriggers
void SetBaseState(bool has_base)
const string SOUND_BUILD_METAL
override string GetLoopFoldSoundset()
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
override bool CanPutIntoHands(EntityAI parent)
bool IsPartBuildInSyncData(int part_id)
override bool CanRemoveFromCargo(EntityAI parent)
const string SOUND_DISMANTLE_WOOD_STAIRS
const int ECE_PLACE_ON_SURFACE
PlayerSpawnPreset slotName
void Construction(BaseBuildingBase parent)
void DayZPlayerUtils()
cannot be instantiated
string GetLoopFoldSoundset()
ItemSoundHandler GetItemSoundHandler()
bool m_FixDamageSystemInit
void ItemSoundHandler(ItemBase parent)
override void SetLoopInterval(float time)
A particular version of the deferred loop used to not damage players inside vehicles.
override void SetDeferDuration(float time)
proto native World GetWorld()
override ScriptCallQueue GetCallQueue(int call_category)
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.
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.
Wrapper class for managing sound through SEffectManager.
proto native int GetSlot()
returns slot id if current type is Attachment
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
override bool CanUseConstruction()
static bool IsBaseBuildingLogEnable()
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native void GetPlayerList(out array< Man > players)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
override string GetDebugName()
Serializer ParamsReadContext
proto native CGame GetGame()
Serializer ParamsWriteContext
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.
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
class JsonUndergroundAreaTriggerData GetPosition
bool Contains(string sample)
Returns true if sample is substring of string.
proto int ToLower()
Changes string to lowercase. Returns length.