2298{
2300
2302
2304
2306
2312
2313
2314
2320
2326
2328
2332
2333
2335 {
2337
2338
2339 RegisterNetSyncVariableInt( "m_SyncParts01" );
2340 RegisterNetSyncVariableInt( "m_SyncParts02" );
2341 RegisterNetSyncVariableInt( "m_SyncParts03" );
2342 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2343 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2344 RegisterNetSyncVariableBool( "m_HasBase" );
2345
2346
2348
2349 if (ConfigIsExisting("hybridAttachments"))
2350 {
2353 }
2354 if (ConfigIsExisting("mountables"))
2355 {
2358 }
2359
2361 }
2362
2364 {
2365 super.EEDelete(parent);
2366
2368 {
2369 areaDamage.Destroy();
2370 }
2371
2372 }
2373
2375 {
2376 return "disableBaseDamage";
2377 }
2378
2380 {
2381 return true;
2382 }
2383
2385 {
2386 return EInventoryIconVisibility.HIDE_VICINITY;
2387 }
2388
2390 {
2391 super.InitItemSounds();
2392
2396
2401 }
2402
2404 {
2405 return "putDown_FenceKit_SoundSet";
2406 }
2407
2409 {
2410 return "Shelter_Site_Build_Loop_SoundSet";
2411 }
2412
2413
2415 {
2417 {
2418 SetSynchDirty();
2419 }
2420 }
2421
2423 {
2425 super.OnVariablesSynchronized();
2426
2428 }
2429
2431 {
2432
2434
2435
2437
2438
2440 }
2441
2442
2444 {
2445
2446 int offset;
2447 int mask;
2448
2449 if ( part_id >= 1 && part_id <= 31 )
2450 {
2451 offset = part_id - 1;
2452 mask = 1 << offset;
2453
2455 }
2456 else if ( part_id >= 32 && part_id <= 62 )
2457 {
2458 offset = ( part_id % 32 );
2459 mask = 1 << offset;
2460
2462 }
2463 else if ( part_id >= 63 && part_id <= 93 )
2464 {
2465 offset = ( part_id % 63 );
2466 mask = 1 << offset;
2467
2469 }
2470 }
2471
2473 {
2474
2475 int offset;
2476 int mask;
2477
2478 if ( part_id >= 1 && part_id <= 31 )
2479 {
2480 offset = part_id - 1;
2481 mask = 1 << offset;
2482
2484 }
2485 else if ( part_id >= 32 && part_id <= 62 )
2486 {
2487 offset = ( part_id % 32 );
2488 mask = 1 << offset;
2489
2491 }
2492 else if ( part_id >= 63 && part_id <= 93 )
2493 {
2494 offset = ( part_id % 63 );
2495 mask = 1 << offset;
2496
2498 }
2499 }
2500
2502 {
2503
2504 int offset;
2505 int mask;
2506
2507 if ( part_id >= 1 && part_id <= 31 )
2508 {
2509 offset = part_id - 1;
2510 mask = 1 << offset;
2511
2513 {
2514 return true;
2515 }
2516 }
2517 else if ( part_id >= 32 && part_id <= 62 )
2518 {
2519 offset = ( part_id % 32 );
2520 mask = 1 << offset;
2521
2523 {
2524 return true;
2525 }
2526 }
2527 else if ( part_id >= 63 && part_id <= 93 )
2528 {
2529 offset = ( part_id % 63 );
2530 mask = 1 << offset;
2531
2533 {
2534 return true;
2535 }
2536 }
2537
2538 return false;
2539 }
2540
2542 {
2545 }
2546
2548 {
2549
2552 }
2553
2555 {
2557 {
2560
2561 switch( build_action_id )
2562 {
2566 }
2567 }
2568 }
2569
2570
2572 {
2574 bool is_base = part.
IsBase();
2577 if ( is_part_built_sync )
2578 {
2580 {
2584
2585 if (is_base)
2586 {
2589 }
2590 }
2591 }
2592 else
2593 {
2595 {
2599
2600 if (is_base)
2601 {
2604 }
2605 }
2606 }
2607
2608
2610 }
2611
2612
2614 {
2617
2618 for ( int i = 0; i < construction_parts.Count(); ++i )
2619 {
2620 string key = construction_parts.GetKey( i );
2623 }
2624
2625
2627 }
2628
2630 {
2633
2634 for ( int i = 0; i < construction_parts.Count(); ++i )
2635 {
2636 string key = construction_parts.GetKey( i );
2638
2639 if ( value.
GetId() ==
id )
2640 {
2641 return value;
2642 }
2643 }
2644
2645 return NULL;
2646 }
2647
2648
2649
2651 {
2653 }
2654
2656 {
2658 }
2659
2661 {
2662 return true;
2663 }
2664
2666 {
2667 return false;
2668 }
2669
2670
2672 {
2675 {
2677 }
2678
2679 return construction_kit;
2680 }
2681
2683 {
2686 {
2688 }
2689 }
2690
2692 {
2694 }
2695
2697 {
2698 return "";
2699 }
2700
2702 {
2705 }
2706
2707
2709 {
2712 }
2713
2714
2716 {
2717 super.OnStoreSave( ctx );
2718
2719
2723
2725 }
2726
2728 {
2729 if ( !super.OnStoreLoad( ctx, version ) )
2730 return false;
2731
2732
2733
2735 {
2737 return false;
2738 }
2740 {
2742 return false;
2743 }
2745 {
2747 return false;
2748 }
2749
2750
2752 {
2754 return false;
2755 }
2756
2757
2758 return true;
2759 }
2760
2762 {
2763 super.AfterStoreLoad();
2764
2766 {
2768 }
2769 }
2770
2772 {
2773
2775
2776
2779
2780
2782 }
2783
2785 {
2786 super.OnCreatePhysics();
2789 }
2790
2792 {
2794 return;
2795
2796 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2797
2799 return;
2800
2802 string part_name = zone;
2804
2806 {
2807 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2808
2809 if ( construction_part && construction.IsPartConstructed( part_name ) )
2810 {
2812 construction.DestroyConnectedParts(part_name);
2813 }
2814
2815
2816 if ( part_name.
Contains(
"barbed") )
2817 {
2818 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2819 if (barbed_wire)
2820 barbed_wire.SetMountedState( false );
2821 }
2822 }
2823 }
2824
2826 {
2828 {
2830 }
2831
2832 super.EEOnAfterLoad();
2833 }
2834
2836 {
2837 super.EEInit();
2838
2839
2841
2842
2843 #ifdef DEVELOPER
2845 #endif
2846 }
2847
2849 {
2850 super.EEItemAttached( item, slot_name );
2851
2855 }
2856
2858 {
2859 super.EEItemDetached( item, slot_name );
2860
2863 }
2864
2865 protected void OnSetSlotLock(
int slotId,
bool locked,
bool was_locked )
2866 {
2869
2872 }
2873
2874
2876 {
2877 return true;
2878 }
2879
2880
2881
2883 {
2885
2886
2887 if (construtionPart.
IsBase())
2888 {
2890
2891
2893 }
2894
2895
2897
2898
2900
2901
2903
2905
2907
2908
2910
2911
2913 }
2914
2916 {
2917
2919 }
2920
2921
2923 {
2926
2927
2929
2930
2932
2933
2935
2936
2938
2940
2941
2943
2944
2946
2947
2948 if (construtionPart.
IsBase())
2949 {
2950
2952 }
2953 }
2954
2956 {
2957
2959 }
2960
2961
2962 void OnPartDestroyedServer(Man player,
string part_name,
int action_id,
bool destroyed_by_connected_part =
false)
2963 {
2966
2967
2969
2970
2972
2973
2975
2976
2978
2980
2981
2983
2984
2986
2987
2988 if (construtionPart.
IsBase())
2989 {
2990
2992 }
2993 }
2994
2996 {
2997
2999 }
3000
3003 {
3004 bool process = false;
3005
3006
3010
3011 if (process)
3012 {
3013 if (!MemoryPointExists(part.
m_PartName +
"_min") || !MemoryPointExists(part.
m_PartName +
"_max"))
3014 {
3016 return;
3017 }
3018
3020 mins = ModelToWorld(GetMemoryPointPos(part.
m_PartName +
"_min"));
3021 maxs = ModelToWorld(GetMemoryPointPos(part.
m_PartName +
"_max"));
3022
3023
3025 minTmp[0] =
Math.
Min(mins[0],maxs[0]);
3026 maxTmp[0] =
Math.
Max(mins[0],maxs[0]);
3027 minTmp[1] =
Math.
Min(mins[1],maxs[1]);
3028 maxTmp[1] =
Math.
Max(mins[1],maxs[1]);
3029 minTmp[2] =
Math.
Min(mins[2],maxs[2]);
3030 maxTmp[2] =
Math.
Max(mins[2],maxs[2]);
3031 mins = minTmp;
3032 maxs = maxTmp;
3033
3034 maxs[1] = maxs[1] + 0.35;
3035
3037 }
3038 }
3039
3042 {
3045
3046
3048 foreach (
EntityAI entity : foundEntities)
3049 {
3052 }
3053 }
3054
3055
3057 {
3059
3063 }
3064
3066 {
3068
3070 {
3072 }
3073 else
3074 {
3076 }
3077
3079 }
3080
3082 {
3084
3086 foreach (
string slotName : attachmentSlots)
3087 {
3089 }
3090
3091
3094 else
3096
3098 }
3099
3101 {
3102 string slotNameMounted = slot_name + "_Mounted";
3103 EntityAI attachment = FindAttachmentBySlotName(slot_name);
3104
3105 if (attachment)
3106 {
3107 BarbedWire barbedWire = BarbedWire.Cast(attachment);
3108 if (barbedWire && barbedWire.IsMounted())
3110 else
3112
3113 if (is_locked)
3114 {
3115 SetAnimationPhase(slotNameMounted, 0);
3116 SetAnimationPhase(slot_name, 1);
3117 }
3118 else
3119 {
3120 SetAnimationPhase(slotNameMounted, 1);
3121 SetAnimationPhase(slot_name, 0);
3122 }
3123 }
3124 else
3125 {
3126 SetAnimationPhase(slotNameMounted, 1);
3127 SetAnimationPhase(slot_name, 1);
3128
3130 }
3131 }
3132
3133
3135 {
3138
3141
3144
3145 foreach (
string slotName : attachmentSlots)
3146 {
3148 }
3149
3150
3152 {
3155
3157 }
3158 else
3159 {
3162
3164 }
3165
3168 }
3169
3171 {
3172
3174 return;
3175
3176 string slot_name_mounted = slot_name + "_Mounted";
3177 EntityAI attachment = FindAttachmentBySlotName( slot_name );
3178
3179
3181 RemoveProxyPhysics( slot_name_mounted );
3182 RemoveProxyPhysics( slot_name );
3183
3184 if ( attachment )
3185 {
3187 if ( is_locked )
3188 {
3190 AddProxyPhysics( slot_name_mounted );
3191 }
3192 else
3193 {
3195 AddProxyPhysics( slot_name );
3196 }
3197 }
3198 }
3199
3201 {
3202 SetAffectPathgraph( true, false );
3204 }
3205
3207 {
3208 return true;
3209 }
3210
3212 {
3213 return true;
3214 }
3215
3217 {
3218 if ( attachment )
3219 {
3221 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3222
3223 return GetInventory().GetSlotLock( inventory_location.
GetSlot() );
3224 }
3225
3226 return false;
3227 }
3228
3230 {
3232 }
3233
3234
3236 {
3237 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3238 if (
GetGame().ConfigIsExisting( config_path ) )
3239 {
3241 }
3242 }
3243
3245 {
3246 return true;
3247 }
3248
3250 {
3251 return true;
3252 }
3253
3255 {
3256 return true;
3257 }
3258
3259
3261 {
3263 {
3265 }
3266
3268 }
3269
3271 {
3273 }
3274
3275
3276
3278 {
3279 return super.CanReceiveAttachment(attachment, slotId);
3280 }
3281
3283 {
3284 int attachment_count = GetInventory().AttachmentCount();
3285 if ( attachment_count > 0 )
3286 {
3287 if (
HasBase() && attachment_count == 1 )
3288 {
3289 return false;
3290 }
3291
3292 return true;
3293 }
3294
3295 return false;
3296 }
3297
3299 {
3300 return true;
3301 }
3302
3304 {
3305 return false;
3306 }
3307
3308
3310 {
3311 return false;
3312 }
3313
3315 {
3316 return false;
3317 }
3318
3319
3321 {
3322 return false;
3323 }
3324
3325
3326
3328 {
3329 return true;
3330 }
3331
3333 {
3334 return true;
3335 }
3336
3339 {
3340 return false;
3341 }
3342
3343
3345 {
3346 return true;
3347 }
3348
3349
3351 {
3352 return false;
3353 }
3354
3355
3357 {
3358 return true;
3359 }
3360
3361
3363 {
3364 if (
HasBase() || GetInventory().AttachmentCount() > 0 )
3365 {
3366 return false;
3367 }
3368
3369 return true;
3370 }
3371
3373 {
3376
3377 return item;
3378 }
3379
3380
3382 {
3384 {
3385
3387
3388
3391
3393 if ( MemoryPointExists( slot_name + "_min" ) )
3394 {
3395 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3396 }
3397 if ( MemoryPointExists( slot_name + "_max" ) )
3398 {
3399 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3400 }
3401
3402
3405
3406
3409 center = ModelToWorld( center );
3410
3411
3414
3415 areaDamage.SetExtents( extents[0], extents[1] );
3416 areaDamage.SetAreaPosition( center );
3417 areaDamage.SetAreaOrientation( orientation );
3420 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3421 areaDamage.SetAmmoName( "BarbedWireHit" );
3422 areaDamage.Spawn();
3423
3425 }
3426 }
3427
3429 {
3430 if ( angle_deg != 0 )
3431 {
3432
3433 orientation[0] = orientation[0] - angle_deg;
3434
3435
3437 if ( MemoryPointExists( "rotate_axis" ) )
3438 {
3439 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3440 }
3441 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];
3442 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];
3443 center[0] = r_center_x;
3444 center[2] = r_center_z;
3445 }
3446 }
3447
3449 {
3451 {
3454 {
3455 if (areaDamage)
3456 {
3457 areaDamage.Destroy();
3458 }
3459
3461 }
3462 }
3463 }
3464
3466 {
3467 return true;
3468 }
3469
3470
3471
3472
3474 {
3476 }
3477
3479 {
3481 }
3482
3484 {
3486 }
3487
3489 {
3491
3492 switch ( material_type )
3493 {
3499 }
3500
3501 return "";
3502 }
3503
3505 {
3507
3508 switch ( material_type )
3509 {
3515 }
3516
3517 return "";
3518 }
3519
3520
3522 {
3524 {
3525
3527 {
3528 SetHealth(slot_name,"Health",item.GetHealth());
3529 }
3530 }
3531 }
3532
3534 {
3535 return 111;
3536 }
3537
3539 {
3540 super.SetActions();
3541
3545 }
3546
3547
3548
3549
3551 {
3552 }
3553
3556 {
3557 return null;
3558 }
3559
3561 {
3563 }
3564
3566 {
3569
3570 Man p;
3571
3572 #ifdef SERVER
3575 if (players.Count())
3576 p = players[0];
3577 #else
3579 #endif
3580
3582 {
3583 bool excluded = false;
3585 if (excludes)
3586 {
3587 foreach (string exclude : excludes)
3588 {
3590 {
3591 excluded = true;
3592 break;
3593 }
3594 }
3595 }
3596
3597 if (!excluded)
3598 {
3600 }
3601 }
3602
3604 }
3605}
3606
3608{
3609#ifdef BSB_DEBUG
3611#else
3612
3613#endif
3614}
3616{
3617#ifdef BSB_DEBUG_SPAM
3619#else
3620
3621#endif
3622}
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.