Disconnected temporarily.
2057{
2059
2061
2063
2065
2071
2072
2073
2079
2085
2087
2091
2092
2094 {
2096
2097
2098 RegisterNetSyncVariableInt( "m_SyncParts01" );
2099 RegisterNetSyncVariableInt( "m_SyncParts02" );
2100 RegisterNetSyncVariableInt( "m_SyncParts03" );
2101 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2102 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2103 RegisterNetSyncVariableBool( "m_HasBase" );
2104
2105
2107
2108 if (ConfigIsExisting("hybridAttachments"))
2109 {
2112 }
2113 if (ConfigIsExisting("mountables"))
2114 {
2117 }
2118
2120 }
2121
2123 {
2124 super.EEDelete(parent);
2125
2127 {
2128 areaDamage.Destroy();
2129 }
2130
2131 }
2132
2134 {
2135 return "disableBaseDamage";
2136 }
2137
2139 {
2140 return true;
2141 }
2142
2144 {
2145 return EInventoryIconVisibility.HIDE_VICINITY;
2146 }
2147
2149 {
2150 super.InitItemSounds();
2151
2155
2160 }
2161
2163 {
2164 return "putDown_FenceKit_SoundSet";
2165 }
2166
2168 {
2169 return "Shelter_Site_Build_Loop_SoundSet";
2170 }
2171
2172
2174 {
2176 {
2177 SetSynchDirty();
2178 }
2179 }
2180
2182 {
2184 super.OnVariablesSynchronized();
2185
2187 }
2188
2190 {
2191
2193
2194
2196
2197
2199 }
2200
2201
2203 {
2204
2205 int offset;
2206 int mask;
2207
2208 if ( part_id >= 1 && part_id <= 31 )
2209 {
2210 offset = part_id - 1;
2211 mask = 1 << offset;
2212
2214 }
2215 else if ( part_id >= 32 && part_id <= 62 )
2216 {
2217 offset = ( part_id % 32 );
2218 mask = 1 << offset;
2219
2221 }
2222 else if ( part_id >= 63 && part_id <= 93 )
2223 {
2224 offset = ( part_id % 63 );
2225 mask = 1 << offset;
2226
2228 }
2229 }
2230
2232 {
2233
2234 int offset;
2235 int mask;
2236
2237 if ( part_id >= 1 && part_id <= 31 )
2238 {
2239 offset = part_id - 1;
2240 mask = 1 << offset;
2241
2243 }
2244 else if ( part_id >= 32 && part_id <= 62 )
2245 {
2246 offset = ( part_id % 32 );
2247 mask = 1 << offset;
2248
2250 }
2251 else if ( part_id >= 63 && part_id <= 93 )
2252 {
2253 offset = ( part_id % 63 );
2254 mask = 1 << offset;
2255
2257 }
2258 }
2259
2261 {
2262
2263 int offset;
2264 int mask;
2265
2266 if ( part_id >= 1 && part_id <= 31 )
2267 {
2268 offset = part_id - 1;
2269 mask = 1 << offset;
2270
2272 {
2273 return true;
2274 }
2275 }
2276 else if ( part_id >= 32 && part_id <= 62 )
2277 {
2278 offset = ( part_id % 32 );
2279 mask = 1 << offset;
2280
2282 {
2283 return true;
2284 }
2285 }
2286 else if ( part_id >= 63 && part_id <= 93 )
2287 {
2288 offset = ( part_id % 63 );
2289 mask = 1 << offset;
2290
2292 {
2293 return true;
2294 }
2295 }
2296
2297 return false;
2298 }
2299
2301 {
2304 }
2305
2307 {
2308
2311 }
2312
2314 {
2316 {
2319
2320 switch( build_action_id )
2321 {
2325 }
2326 }
2327 }
2328
2329
2331 {
2333 bool is_base = part.
IsBase();
2336 if ( is_part_built_sync )
2337 {
2339 {
2343
2344 if (is_base)
2345 {
2348 }
2349 }
2350 }
2351 else
2352 {
2354 {
2358
2359 if (is_base)
2360 {
2363 }
2364 }
2365 }
2366
2367
2369 }
2370
2371
2373 {
2376
2377 for ( int i = 0; i < construction_parts.Count(); ++i )
2378 {
2379 string key = construction_parts.GetKey( i );
2382 }
2383
2384
2386 }
2387
2389 {
2392
2393 for ( int i = 0; i < construction_parts.Count(); ++i )
2394 {
2395 string key = construction_parts.GetKey( i );
2397
2398 if ( value.
GetId() ==
id )
2399 {
2400 return value;
2401 }
2402 }
2403
2404 return NULL;
2405 }
2406
2407
2408
2410 {
2412 }
2413
2415 {
2417 }
2418
2420 {
2421 return true;
2422 }
2423
2425 {
2426 return false;
2427 }
2428
2429
2431 {
2434 {
2436 }
2437
2438 return construction_kit;
2439 }
2440
2442 {
2445 {
2447 }
2448 }
2449
2451 {
2453 }
2454
2456 {
2457 return "";
2458 }
2459
2461 {
2464 }
2465
2466
2468 {
2471 }
2472
2473
2475 {
2476 super.OnStoreSave( ctx );
2477
2478
2482
2484 }
2485
2487 {
2488 if ( !super.OnStoreLoad( ctx, version ) )
2489 return false;
2490
2491
2492
2494 {
2496 return false;
2497 }
2499 {
2501 return false;
2502 }
2504 {
2506 return false;
2507 }
2508
2509
2511 {
2513 return false;
2514 }
2515
2516
2517 return true;
2518 }
2519
2521 {
2522 super.AfterStoreLoad();
2523
2525 {
2527 }
2528 }
2529
2531 {
2532
2534
2535
2538
2539
2541 }
2542
2544 {
2545 super.OnCreatePhysics();
2548 }
2549
2551 {
2553 return;
2554
2555 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2556
2558 return;
2559
2561 string part_name = zone;
2563
2565 {
2566 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2567
2568 if ( construction_part && construction.IsPartConstructed( part_name ) )
2569 {
2571 construction.DestroyConnectedParts(part_name);
2572 }
2573
2574
2575 if ( part_name.
Contains(
"barbed") )
2576 {
2577 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2578 if (barbed_wire)
2579 barbed_wire.SetMountedState( false );
2580 }
2581 }
2582 }
2583
2585 {
2587 {
2589 }
2590
2591 super.EEOnAfterLoad();
2592 }
2593
2595 {
2596 super.EEInit();
2597
2598
2600
2601
2602 #ifdef DEVELOPER
2604 #endif
2605 }
2606
2608 {
2609 super.EEItemAttached( item, slot_name );
2610
2614 }
2615
2617 {
2618 super.EEItemDetached( item, slot_name );
2619
2622 }
2623
2624 protected void OnSetSlotLock(
int slotId,
bool locked,
bool was_locked )
2625 {
2628
2631 }
2632
2633
2635 {
2636 return true;
2637 }
2638
2639
2640
2642 {
2644
2645
2646 if (construtionPart.
IsBase())
2647 {
2649
2650
2652 }
2653
2654
2656
2657
2659
2660
2662
2664
2666
2667
2669
2670
2672 }
2673
2675 {
2676
2678 }
2679
2680
2682 {
2685
2686
2688
2689
2691
2692
2694
2695
2697
2699
2700
2702
2703
2705
2706
2707 if (construtionPart.
IsBase())
2708 {
2709
2711 }
2712 }
2713
2715 {
2716
2718 }
2719
2720
2721 void OnPartDestroyedServer(Man player,
string part_name,
int action_id,
bool destroyed_by_connected_part =
false)
2722 {
2725
2726
2728
2729
2731
2732
2734
2735
2737
2739
2740
2742
2743
2745
2746
2747 if (construtionPart.
IsBase())
2748 {
2749
2751 }
2752 }
2753
2755 {
2756
2758 }
2759
2762 {
2763 bool process = false;
2764
2765
2769
2770 if (process)
2771 {
2772 if (!MemoryPointExists(part.
m_PartName +
"_min") || !MemoryPointExists(part.
m_PartName +
"_max"))
2773 {
2775 return;
2776 }
2777
2779 mins = ModelToWorld(GetMemoryPointPos(part.
m_PartName +
"_min"));
2780 maxs = ModelToWorld(GetMemoryPointPos(part.
m_PartName +
"_max"));
2781
2782
2784 minTmp[0] =
Math.
Min(mins[0],maxs[0]);
2785 maxTmp[0] =
Math.
Max(mins[0],maxs[0]);
2786 minTmp[1] =
Math.
Min(mins[1],maxs[1]);
2787 maxTmp[1] =
Math.
Max(mins[1],maxs[1]);
2788 minTmp[2] =
Math.
Min(mins[2],maxs[2]);
2789 maxTmp[2] =
Math.
Max(mins[2],maxs[2]);
2790 mins = minTmp;
2791 maxs = maxTmp;
2792
2793 maxs[1] = maxs[1] + 0.35;
2794
2796 }
2797 }
2798
2801 {
2804
2805
2807 foreach (
EntityAI entity : foundEntities)
2808 {
2811 }
2812 }
2813
2814
2816 {
2818
2822 }
2823
2825 {
2827
2829 {
2831 }
2832 else
2833 {
2835 }
2836
2838 }
2839
2841 {
2843
2845 foreach (
string slotName : attachmentSlots)
2846 {
2848 }
2849
2850
2853 else
2855
2857 }
2858
2860 {
2861 string slotNameMounted = slot_name + "_Mounted";
2862 EntityAI attachment = FindAttachmentBySlotName(slot_name);
2863
2864 if (attachment)
2865 {
2866 BarbedWire barbedWire = BarbedWire.Cast(attachment);
2867 if (barbedWire && barbedWire.IsMounted())
2869 else
2871
2872 if (is_locked)
2873 {
2874 SetAnimationPhase(slotNameMounted, 0);
2875 SetAnimationPhase(slot_name, 1);
2876 }
2877 else
2878 {
2879 SetAnimationPhase(slotNameMounted, 1);
2880 SetAnimationPhase(slot_name, 0);
2881 }
2882 }
2883 else
2884 {
2885 SetAnimationPhase(slotNameMounted, 1);
2886 SetAnimationPhase(slot_name, 1);
2887
2889 }
2890 }
2891
2892
2894 {
2897
2900
2903
2904 foreach (
string slotName : attachmentSlots)
2905 {
2907 }
2908
2909
2911 {
2914
2916 }
2917 else
2918 {
2921
2923 }
2924
2927 }
2928
2930 {
2931
2933 return;
2934
2935 string slot_name_mounted = slot_name + "_Mounted";
2936 EntityAI attachment = FindAttachmentBySlotName( slot_name );
2937
2938
2940 RemoveProxyPhysics( slot_name_mounted );
2941 RemoveProxyPhysics( slot_name );
2942
2943 if ( attachment )
2944 {
2946 if ( is_locked )
2947 {
2949 AddProxyPhysics( slot_name_mounted );
2950 }
2951 else
2952 {
2954 AddProxyPhysics( slot_name );
2955 }
2956 }
2957 }
2958
2960 {
2961 SetAffectPathgraph( true, false );
2963 }
2964
2966 {
2967 return true;
2968 }
2969
2971 {
2972 return true;
2973 }
2974
2976 {
2977 if ( attachment )
2978 {
2980 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
2981
2982 return GetInventory().GetSlotLock( inventory_location.
GetSlot() );
2983 }
2984
2985 return false;
2986 }
2987
2989 {
2991 }
2992
2993
2995 {
2996 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
2997 if (
GetGame().ConfigIsExisting( config_path ) )
2998 {
3000 }
3001 }
3002
3004 {
3005 return true;
3006 }
3007
3009 {
3010 return true;
3011 }
3012
3014 {
3015 return true;
3016 }
3017
3018
3020 {
3022 {
3024 }
3025
3027 }
3028
3030 {
3032 }
3033
3034
3035
3037 {
3038 return super.CanReceiveAttachment(attachment, slotId);
3039 }
3040
3042 {
3043 int attachment_count = GetInventory().AttachmentCount();
3044 if ( attachment_count > 0 )
3045 {
3046 if (
HasBase() && attachment_count == 1 )
3047 {
3048 return false;
3049 }
3050
3051 return true;
3052 }
3053
3054 return false;
3055 }
3056
3058 {
3059 return true;
3060 }
3061
3063 {
3064 return false;
3065 }
3066
3067
3069 {
3070 return false;
3071 }
3072
3074 {
3075 return false;
3076 }
3077
3078
3080 {
3081 return false;
3082 }
3083
3084
3085
3087 {
3088 return true;
3089 }
3090
3092 {
3093 return true;
3094 }
3095
3098 {
3099 return false;
3100 }
3101
3102
3104 {
3105 return true;
3106 }
3107
3108
3110 {
3111 return false;
3112 }
3113
3114
3116 {
3117 return true;
3118 }
3119
3120
3122 {
3123 if (
HasBase() || GetInventory().AttachmentCount() > 0 )
3124 {
3125 return false;
3126 }
3127
3128 return true;
3129 }
3130
3132 {
3135
3136 return item;
3137 }
3138
3139
3141 {
3143 {
3144
3146
3147
3150
3152 if ( MemoryPointExists( slot_name + "_min" ) )
3153 {
3154 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3155 }
3156 if ( MemoryPointExists( slot_name + "_max" ) )
3157 {
3158 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3159 }
3160
3161
3164
3165
3168 center = ModelToWorld( center );
3169
3170
3173
3174 areaDamage.SetExtents( extents[0], extents[1] );
3175 areaDamage.SetAreaPosition( center );
3176 areaDamage.SetAreaOrientation( orientation );
3179 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3180 areaDamage.SetAmmoName( "BarbedWireHit" );
3181 areaDamage.Spawn();
3182
3184 }
3185 }
3186
3188 {
3189 if ( angle_deg != 0 )
3190 {
3191
3192 orientation[0] = orientation[0] - angle_deg;
3193
3194
3196 if ( MemoryPointExists( "rotate_axis" ) )
3197 {
3198 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3199 }
3200 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];
3201 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];
3202 center[0] = r_center_x;
3203 center[2] = r_center_z;
3204 }
3205 }
3206
3208 {
3210 {
3213 {
3214 if (areaDamage)
3215 {
3216 areaDamage.Destroy();
3217 }
3218
3220 }
3221 }
3222 }
3223
3225 {
3226 return true;
3227 }
3228
3229
3230
3231
3233 {
3235 }
3236
3238 {
3240 }
3241
3243 {
3245 }
3246
3248 {
3250
3251 switch ( material_type )
3252 {
3258 }
3259
3260 return "";
3261 }
3262
3264 {
3266
3267 switch ( material_type )
3268 {
3274 }
3275
3276 return "";
3277 }
3278
3279
3281 {
3283 {
3284
3286 {
3287 SetHealth(slot_name,"Health",item.GetHealth());
3288 }
3289 }
3290 }
3291
3293 {
3294 return 111;
3295 }
3296
3298 {
3299 super.SetActions();
3300
3304 }
3305
3306
3307
3308
3310 {
3311 }
3312
3315 {
3316 return null;
3317 }
3318
3320 {
3322 }
3323
3325 {
3328
3329 Man p;
3330
3331 #ifdef SERVER
3334 if (players.Count())
3335 p = players[0];
3336 #else
3338 #endif
3339
3341 {
3342 bool excluded = false;
3344 if (excludes)
3345 {
3346 foreach (string exclude : excludes)
3347 {
3349 {
3350 excluded = true;
3351 break;
3352 }
3353 }
3354 }
3355
3356 if (!excluded)
3357 {
3359 }
3360 }
3361
3363 }
3364}
3365
3367{
3368#ifdef BSB_DEBUG
3370#else
3371
3372#endif
3373}
3375{
3376#ifdef BSB_DEBUG_SPAM
3378#else
3379
3380#endif
3381}
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.