Some buildings can only be built from outside.
2354{
2356
2358
2360
2362
2368
2369
2370
2376
2382
2384
2388
2389
2391 {
2393
2394
2395 RegisterNetSyncVariableInt( "m_SyncParts01" );
2396 RegisterNetSyncVariableInt( "m_SyncParts02" );
2397 RegisterNetSyncVariableInt( "m_SyncParts03" );
2398 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2399 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2400 RegisterNetSyncVariableBool( "m_HasBase" );
2401
2402
2404
2405 if (ConfigIsExisting("hybridAttachments"))
2406 {
2409 }
2410 if (ConfigIsExisting("mountables"))
2411 {
2414 }
2415
2417 }
2418
2420 {
2421 super.EEDelete(parent);
2422
2424 {
2425 areaDamage.Destroy();
2426 }
2427
2428 }
2429
2431 {
2432 return "disableBaseDamage";
2433 }
2434
2436 {
2437 return true;
2438 }
2439
2441 {
2442 return EInventoryIconVisibility.HIDE_VICINITY;
2443 }
2444
2446 {
2447 super.InitItemSounds();
2448
2452
2457 }
2458
2460 {
2461 return "putDown_FenceKit_SoundSet";
2462 }
2463
2465 {
2466 return "Shelter_Site_Build_Loop_SoundSet";
2467 }
2468
2469
2471 {
2473 {
2474 SetSynchDirty();
2475 }
2476 }
2477
2479 {
2481 super.OnVariablesSynchronized();
2482
2484 }
2485
2487 {
2488
2490
2491
2493
2494
2496 }
2497
2498
2500 {
2501
2502 int offset;
2503 int mask;
2504
2505 if ( part_id >= 1 && part_id <= 31 )
2506 {
2507 offset = part_id - 1;
2508 mask = 1 << offset;
2509
2511 }
2512 else if ( part_id >= 32 && part_id <= 62 )
2513 {
2514 offset = ( part_id % 32 );
2515 mask = 1 << offset;
2516
2518 }
2519 else if ( part_id >= 63 && part_id <= 93 )
2520 {
2521 offset = ( part_id % 63 );
2522 mask = 1 << offset;
2523
2525 }
2526 }
2527
2529 {
2530
2531 int offset;
2532 int mask;
2533
2534 if ( part_id >= 1 && part_id <= 31 )
2535 {
2536 offset = part_id - 1;
2537 mask = 1 << offset;
2538
2540 }
2541 else if ( part_id >= 32 && part_id <= 62 )
2542 {
2543 offset = ( part_id % 32 );
2544 mask = 1 << offset;
2545
2547 }
2548 else if ( part_id >= 63 && part_id <= 93 )
2549 {
2550 offset = ( part_id % 63 );
2551 mask = 1 << offset;
2552
2554 }
2555 }
2556
2558 {
2559
2560 int offset;
2561 int mask;
2562
2563 if ( part_id >= 1 && part_id <= 31 )
2564 {
2565 offset = part_id - 1;
2566 mask = 1 << offset;
2567
2569 {
2570 return true;
2571 }
2572 }
2573 else if ( part_id >= 32 && part_id <= 62 )
2574 {
2575 offset = ( part_id % 32 );
2576 mask = 1 << offset;
2577
2579 {
2580 return true;
2581 }
2582 }
2583 else if ( part_id >= 63 && part_id <= 93 )
2584 {
2585 offset = ( part_id % 63 );
2586 mask = 1 << offset;
2587
2589 {
2590 return true;
2591 }
2592 }
2593
2594 return false;
2595 }
2596
2598 {
2601 }
2602
2604 {
2605
2608 }
2609
2611 {
2613 {
2616
2617 switch( build_action_id )
2618 {
2622 }
2623 }
2624 }
2625
2626
2628 {
2630 bool is_base = part.
IsBase();
2633 if ( is_part_built_sync )
2634 {
2636 {
2640
2641 if (is_base)
2642 {
2645 }
2646 }
2647 }
2648 else
2649 {
2651 {
2655
2656 if (is_base)
2657 {
2660 }
2661 }
2662 }
2663
2664
2666 }
2667
2668
2670 {
2673
2674 for ( int i = 0; i < construction_parts.Count(); ++i )
2675 {
2676 string key = construction_parts.GetKey( i );
2679 }
2680
2681
2683 }
2684
2686 {
2689
2690 for ( int i = 0; i < construction_parts.Count(); ++i )
2691 {
2692 string key = construction_parts.GetKey( i );
2694
2695 if ( value.
GetId() ==
id )
2696 {
2697 return value;
2698 }
2699 }
2700
2701 return NULL;
2702 }
2703
2704
2705
2707 {
2709 }
2710
2712 {
2714 }
2715
2717 {
2718 return true;
2719 }
2720
2722 {
2723 return false;
2724 }
2725
2726
2728 {
2731 {
2733 }
2734
2735 return construction_kit;
2736 }
2737
2739 {
2742 {
2744 }
2745 }
2746
2748 {
2750 }
2751
2753 {
2754 return "";
2755 }
2756
2758 {
2761 }
2762
2763
2765 {
2768 }
2769
2770
2772 {
2773 super.OnStoreSave( ctx );
2774
2775
2779
2781 }
2782
2784 {
2785 if ( !super.OnStoreLoad( ctx, version ) )
2786 return false;
2787
2788
2789
2791 {
2793 return false;
2794 }
2796 {
2798 return false;
2799 }
2801 {
2803 return false;
2804 }
2805
2806
2808 {
2810 return false;
2811 }
2812
2813
2814 return true;
2815 }
2816
2818 {
2819 super.AfterStoreLoad();
2820
2822 {
2824 }
2825 }
2826
2828 {
2829
2831
2832
2835
2836
2838 }
2839
2841 {
2842 super.OnCreatePhysics();
2845 }
2846
2848 {
2850 return;
2851
2852 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2853
2855 return;
2856
2858 string part_name = zone;
2860
2862 {
2863 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
2864
2865 if ( construction_part && construction.IsPartConstructed( part_name ) )
2866 {
2868 construction.DestroyConnectedParts(part_name);
2869 }
2870
2871
2872 if ( part_name.
Contains(
"barbed") )
2873 {
2874 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
2875 if (barbed_wire)
2876 barbed_wire.SetMountedState( false );
2877 }
2878 }
2879 }
2880
2882 {
2884 {
2886 }
2887
2888 super.EEOnAfterLoad();
2889 }
2890
2892 {
2893 super.EEInit();
2894
2895
2897
2898
2899 #ifdef DEVELOPER
2901 #endif
2902 }
2903
2905 {
2906 super.EEItemAttached( item, slot_name );
2907
2911 }
2912
2914 {
2915 super.EEItemDetached( item, slot_name );
2916
2919 }
2920
2921 protected void OnSetSlotLock(
int slotId,
bool locked,
bool was_locked )
2922 {
2925
2928 }
2929
2930
2932 {
2933 return true;
2934 }
2935
2936
2937
2939 {
2941
2942
2943 if (construtionPart.
IsBase())
2944 {
2946
2947
2949 }
2950
2951
2953
2954
2956
2957
2959
2961
2963
2964
2966
2967
2969 }
2970
2972 {
2973
2975 }
2976
2977
2979 {
2982
2983
2985
2986
2988
2989
2991
2992
2994
2996
2997
2999
3000
3002
3003
3004 if (construtionPart.
IsBase())
3005 {
3006
3008 }
3009 }
3010
3012 {
3013
3015 }
3016
3017
3018 void OnPartDestroyedServer(Man player,
string part_name,
int action_id,
bool destroyed_by_connected_part =
false)
3019 {
3022
3023
3025
3026
3028
3029
3031
3032
3034
3036
3037
3039
3040
3042
3043
3044 if (construtionPart.
IsBase())
3045 {
3046
3048 }
3049 }
3050
3052 {
3053
3055 }
3056
3059 {
3060 bool process = false;
3061
3062
3066
3067 if (process)
3068 {
3069 if (!MemoryPointExists(part.
m_PartName +
"_min") || !MemoryPointExists(part.
m_PartName +
"_max"))
3070 {
3072 return;
3073 }
3074
3076 mins = ModelToWorld(GetMemoryPointPos(part.
m_PartName +
"_min"));
3077 maxs = ModelToWorld(GetMemoryPointPos(part.
m_PartName +
"_max"));
3078
3079
3081 minTmp[0] =
Math.
Min(mins[0],maxs[0]);
3082 maxTmp[0] =
Math.
Max(mins[0],maxs[0]);
3083 minTmp[1] =
Math.
Min(mins[1],maxs[1]);
3084 maxTmp[1] =
Math.
Max(mins[1],maxs[1]);
3085 minTmp[2] =
Math.
Min(mins[2],maxs[2]);
3086 maxTmp[2] =
Math.
Max(mins[2],maxs[2]);
3087 mins = minTmp;
3088 maxs = maxTmp;
3089
3090 maxs[1] = maxs[1] + 0.35;
3091
3093 }
3094 }
3095
3098 {
3101
3102
3104 foreach (
EntityAI entity : foundEntities)
3105 {
3108 }
3109 }
3110
3111
3113 {
3115
3119 }
3120
3122 {
3124
3126 {
3128 }
3129 else
3130 {
3132 }
3133
3135 }
3136
3138 {
3140
3142 foreach (
string slotName : attachmentSlots)
3143 {
3145 }
3146
3147
3150 else
3152
3154 }
3155
3157 {
3158 string slotNameMounted = slot_name + "_Mounted";
3159 EntityAI attachment = FindAttachmentBySlotName(slot_name);
3160
3161 if (attachment)
3162 {
3163 BarbedWire barbedWire = BarbedWire.Cast(attachment);
3164 if (barbedWire && barbedWire.IsMounted())
3166 else
3168
3169 if (is_locked)
3170 {
3171 SetAnimationPhase(slotNameMounted, 0);
3172 SetAnimationPhase(slot_name, 1);
3173 }
3174 else
3175 {
3176 SetAnimationPhase(slotNameMounted, 1);
3177 SetAnimationPhase(slot_name, 0);
3178 }
3179 }
3180 else
3181 {
3182 SetAnimationPhase(slotNameMounted, 1);
3183 SetAnimationPhase(slot_name, 1);
3184
3186 }
3187 }
3188
3189
3191 {
3194
3197
3200
3201 foreach (
string slotName : attachmentSlots)
3202 {
3204 }
3205
3206
3208 {
3211
3213 }
3214 else
3215 {
3218
3220 }
3221
3224 }
3225
3227 {
3228
3230 return;
3231
3232 string slot_name_mounted = slot_name + "_Mounted";
3233 EntityAI attachment = FindAttachmentBySlotName( slot_name );
3234
3235
3237 RemoveProxyPhysics( slot_name_mounted );
3238 RemoveProxyPhysics( slot_name );
3239
3240 if ( attachment )
3241 {
3243 if ( is_locked )
3244 {
3246 AddProxyPhysics( slot_name_mounted );
3247 }
3248 else
3249 {
3251 AddProxyPhysics( slot_name );
3252 }
3253 }
3254 }
3255
3257 {
3258 SetAffectPathgraph( true, false );
3260 }
3261
3263 {
3264 return true;
3265 }
3266
3268 {
3269 return true;
3270 }
3271
3273 {
3274 if ( attachment )
3275 {
3277 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3278
3279 return GetInventory().GetSlotLock( inventory_location.
GetSlot() );
3280 }
3281
3282 return false;
3283 }
3284
3286 {
3288 }
3289
3290
3292 {
3293 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3294 if (
GetGame().ConfigIsExisting( config_path ) )
3295 {
3297 }
3298 }
3299
3301 {
3302 return true;
3303 }
3304
3306 {
3307 return true;
3308 }
3309
3311 {
3312 return true;
3313 }
3314
3315
3317 {
3319 {
3321 }
3322
3324 }
3325
3327 {
3329 }
3330
3331
3332
3334 {
3335 return super.CanReceiveAttachment(attachment, slotId);
3336 }
3337
3339 {
3340 int attachment_count = GetInventory().AttachmentCount();
3341 if ( attachment_count > 0 )
3342 {
3343 if (
HasBase() && attachment_count == 1 )
3344 {
3345 return false;
3346 }
3347
3348 return true;
3349 }
3350
3351 return false;
3352 }
3353
3355 {
3356 return true;
3357 }
3358
3360 {
3361 return false;
3362 }
3363
3364
3366 {
3367 return false;
3368 }
3369
3371 {
3372 return false;
3373 }
3374
3375
3377 {
3378 return false;
3379 }
3380
3381
3382
3384 {
3385 return true;
3386 }
3387
3389 {
3390 return true;
3391 }
3392
3395 {
3396 return false;
3397 }
3398
3399
3401 {
3402 return true;
3403 }
3404
3405
3407 {
3408 return false;
3409 }
3410
3411
3413 {
3414 return true;
3415 }
3416
3417
3419 {
3420 if (
HasBase() || GetInventory().AttachmentCount() > 0 )
3421 {
3422 return false;
3423 }
3424
3425 return true;
3426 }
3427
3429 {
3432
3433 return item;
3434 }
3435
3436
3438 {
3440 {
3441
3443
3444
3447
3449 if ( MemoryPointExists( slot_name + "_min" ) )
3450 {
3451 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3452 }
3453 if ( MemoryPointExists( slot_name + "_max" ) )
3454 {
3455 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3456 }
3457
3458
3461
3462
3465 center = ModelToWorld( center );
3466
3467
3470
3471 areaDamage.SetExtents( extents[0], extents[1] );
3472 areaDamage.SetAreaPosition( center );
3473 areaDamage.SetAreaOrientation( orientation );
3476 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3477 areaDamage.SetAmmoName( "BarbedWireHit" );
3478 areaDamage.Spawn();
3479
3481 }
3482 }
3483
3485 {
3486 if ( angle_deg != 0 )
3487 {
3488
3489 orientation[0] = orientation[0] - angle_deg;
3490
3491
3493 if ( MemoryPointExists( "rotate_axis" ) )
3494 {
3495 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3496 }
3497 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];
3498 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];
3499 center[0] = r_center_x;
3500 center[2] = r_center_z;
3501 }
3502 }
3503
3505 {
3507 {
3510 {
3511 if (areaDamage)
3512 {
3513 areaDamage.Destroy();
3514 }
3515
3517 }
3518 }
3519 }
3520
3522 {
3523 return true;
3524 }
3525
3526
3527
3528
3530 {
3532 }
3533
3535 {
3537 }
3538
3540 {
3542 }
3543
3545 {
3547
3548 switch ( material_type )
3549 {
3555 }
3556
3557 return "";
3558 }
3559
3561 {
3563
3564 switch ( material_type )
3565 {
3571 }
3572
3573 return "";
3574 }
3575
3576
3578 {
3580 {
3581
3583 {
3584 SetHealth(slot_name,"Health",item.GetHealth());
3585 }
3586 }
3587 }
3588
3590 {
3591 return 111;
3592 }
3593
3595 {
3596 super.SetActions();
3597
3601 }
3602
3603
3604
3605
3607 {
3608 }
3609
3612 {
3613 return null;
3614 }
3615
3617 {
3619 }
3620
3622 {
3625
3626 Man p;
3627
3628 #ifdef SERVER
3631 if (players.Count())
3632 p = players[0];
3633 #else
3635 #endif
3636
3638 {
3639 bool excluded = false;
3641 if (excludes)
3642 {
3643 foreach (string exclude : excludes)
3644 {
3646 {
3647 excluded = true;
3648 break;
3649 }
3650 }
3651 }
3652
3653 if (!excluded)
3654 {
3656 }
3657 }
3658
3660 }
3661}
3662
3664{
3665#ifdef BSB_DEBUG
3667#else
3668
3669#endif
3670}
3672{
3673#ifdef BSB_DEBUG_SPAM
3675#else
3676
3677#endif
3678}
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.