Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
2571{
2573
2575
2577
2579
2585
2586
2587
2593
2599
2601
2605
2606
2608 {
2610
2611
2612 RegisterNetSyncVariableInt( "m_SyncParts01" );
2613 RegisterNetSyncVariableInt( "m_SyncParts02" );
2614 RegisterNetSyncVariableInt( "m_SyncParts03" );
2615 RegisterNetSyncVariableInt( "m_InteractedPartId" );
2616 RegisterNetSyncVariableInt( "m_PerformedActionId" );
2617 RegisterNetSyncVariableBool( "m_HasBase" );
2618
2619
2621
2622 if (ConfigIsExisting("hybridAttachments"))
2623 {
2626 }
2627 if (ConfigIsExisting("mountables"))
2628 {
2631 }
2632
2634 }
2635
2637 {
2638 super.EEDelete(parent);
2639
2641 {
2642 areaDamage.Destroy();
2643 }
2644
2645 }
2646
2648 {
2649 return "disableBaseDamage";
2650 }
2651
2653 {
2654 return true;
2655 }
2656
2658 {
2659 return EInventoryIconVisibility.HIDE_VICINITY;
2660 }
2661
2663 {
2664 super.InitItemSounds();
2665
2669
2674 }
2675
2677 {
2678 return "putDown_FenceKit_SoundSet";
2679 }
2680
2682 {
2683 return "Shelter_Site_Build_Loop_SoundSet";
2684 }
2685
2686
2688 {
2690 {
2691 SetSynchDirty();
2692 }
2693 }
2694
2696 {
2698 super.OnVariablesSynchronized();
2699
2701 }
2702
2704 {
2705
2707
2708
2710
2711
2713 }
2714
2715
2717 {
2718
2719 int offset;
2720 int mask;
2721
2722 if ( part_id >= 1 && part_id <= 31 )
2723 {
2724 offset = part_id - 1;
2725 mask = 1 << offset;
2726
2728 }
2729 else if ( part_id >= 32 && part_id <= 62 )
2730 {
2731 offset = ( part_id % 32 );
2732 mask = 1 << offset;
2733
2735 }
2736 else if ( part_id >= 63 && part_id <= 93 )
2737 {
2738 offset = ( part_id % 63 );
2739 mask = 1 << offset;
2740
2742 }
2743 }
2744
2746 {
2747
2748 int offset;
2749 int mask;
2750
2751 if ( part_id >= 1 && part_id <= 31 )
2752 {
2753 offset = part_id - 1;
2754 mask = 1 << offset;
2755
2757 }
2758 else if ( part_id >= 32 && part_id <= 62 )
2759 {
2760 offset = ( part_id % 32 );
2761 mask = 1 << offset;
2762
2764 }
2765 else if ( part_id >= 63 && part_id <= 93 )
2766 {
2767 offset = ( part_id % 63 );
2768 mask = 1 << offset;
2769
2771 }
2772 }
2773
2775 {
2776
2777 int offset;
2778 int mask;
2779
2780 if ( part_id >= 1 && part_id <= 31 )
2781 {
2782 offset = part_id - 1;
2783 mask = 1 << offset;
2784
2786 {
2787 return true;
2788 }
2789 }
2790 else if ( part_id >= 32 && part_id <= 62 )
2791 {
2792 offset = ( part_id % 32 );
2793 mask = 1 << offset;
2794
2796 {
2797 return true;
2798 }
2799 }
2800 else if ( part_id >= 63 && part_id <= 93 )
2801 {
2802 offset = ( part_id % 63 );
2803 mask = 1 << offset;
2804
2806 {
2807 return true;
2808 }
2809 }
2810
2811 return false;
2812 }
2813
2815 {
2818 }
2819
2821 {
2822
2825 }
2826
2828 {
2830 {
2833
2834 switch( build_action_id )
2835 {
2839 }
2840 }
2841 }
2842
2843
2845 {
2847 bool is_base = part.
IsBase();
2850 if ( is_part_built_sync )
2851 {
2853 {
2857
2858 if (is_base)
2859 {
2862 }
2863 }
2864 }
2865 else
2866 {
2868 {
2872
2873 if (is_base)
2874 {
2877 }
2878 }
2879 }
2880
2881
2883 }
2884
2885
2887 {
2890
2891 for ( int i = 0; i < construction_parts.Count(); ++i )
2892 {
2893 string key = construction_parts.GetKey( i );
2896 }
2897
2898
2900 }
2901
2903 {
2906
2907 for ( int i = 0; i < construction_parts.Count(); ++i )
2908 {
2909 string key = construction_parts.GetKey( i );
2911
2912 if ( value.
GetId() ==
id )
2913 {
2914 return value;
2915 }
2916 }
2917
2918 return NULL;
2919 }
2920
2921
2922
2924 {
2926 }
2927
2929 {
2931 }
2932
2934 {
2935 return true;
2936 }
2937
2939 {
2940 return false;
2941 }
2942
2943
2945 {
2948 {
2950 }
2951
2952 return construction_kit;
2953 }
2954
2956 {
2959 {
2961 }
2962 }
2963
2965 {
2967 }
2968
2970 {
2971 return "";
2972 }
2973
2975 {
2978 }
2979
2980
2982 {
2985 }
2986
2987
2989 {
2990 super.OnStoreSave( ctx );
2991
2992
2996
2998 }
2999
3001 {
3002 if ( !super.OnStoreLoad( ctx, version ) )
3003 return false;
3004
3005
3006
3008 {
3010 return false;
3011 }
3013 {
3015 return false;
3016 }
3018 {
3020 return false;
3021 }
3022
3023
3025 {
3027 return false;
3028 }
3029
3030
3031 return true;
3032 }
3033
3035 {
3036 super.AfterStoreLoad();
3037
3039 {
3041 }
3042 }
3043
3045 {
3046
3048
3049
3052
3053
3055 }
3056
3058 {
3059 super.OnCreatePhysics();
3062 }
3063
3065 {
3067 return;
3068
3069 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
3070
3072 return;
3073
3075 string part_name = zone;
3077
3079 {
3080 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
3081
3082 if ( construction_part && construction.IsPartConstructed( part_name ) )
3083 {
3085 construction.DestroyConnectedParts(part_name);
3086 }
3087
3088
3089 if ( part_name.
Contains(
"barbed") )
3090 {
3091 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
3092 if (barbed_wire)
3093 barbed_wire.SetMountedState( false );
3094 }
3095 }
3096 }
3097
3099 {
3101 {
3103 }
3104
3105 super.EEOnAfterLoad();
3106 }
3107
3109 {
3110 super.EEInit();
3111
3112
3114
3115
3116 #ifdef DEVELOPER
3118 #endif
3119 }
3120
3122 {
3123 super.EEItemAttached( item, slot_name );
3124
3128 }
3129
3131 {
3132 super.EEItemDetached( item, slot_name );
3133
3136 }
3137
3138 protected void OnSetSlotLock(
int slotId,
bool locked,
bool was_locked )
3139 {
3142
3145 }
3146
3147
3149 {
3150 return true;
3151 }
3152
3153
3154
3156 {
3158
3159
3160 if (construtionPart.
IsBase())
3161 {
3163
3164
3166 }
3167
3168
3170
3171
3173
3174
3176
3178
3180
3181
3183
3184
3186 }
3187
3189 {
3190
3192 }
3193
3194
3196 {
3199
3200
3202
3203
3205
3206
3208
3209
3211
3213
3214
3216
3217
3219
3220
3221 if (construtionPart.
IsBase())
3222 {
3223
3225 }
3226 }
3227
3229 {
3230
3232 }
3233
3234
3235 void OnPartDestroyedServer(Man player,
string part_name,
int action_id,
bool destroyed_by_connected_part =
false)
3236 {
3239
3240
3242
3243
3245
3246
3248
3249
3251
3253
3254
3256
3257
3259
3260
3261 if (construtionPart.
IsBase())
3262 {
3263
3265 }
3266 }
3267
3269 {
3270
3272 }
3273
3276 {
3277 bool process = false;
3278
3279
3283
3284 if (process)
3285 {
3286 if (!MemoryPointExists(part.
m_PartName +
"_min") || !MemoryPointExists(part.
m_PartName +
"_max"))
3287 {
3289 return;
3290 }
3291
3293 mins = ModelToWorld(GetMemoryPointPos(part.
m_PartName +
"_min"));
3294 maxs = ModelToWorld(GetMemoryPointPos(part.
m_PartName +
"_max"));
3295
3296
3298 minTmp[0] =
Math.
Min(mins[0],maxs[0]);
3299 maxTmp[0] =
Math.
Max(mins[0],maxs[0]);
3300 minTmp[1] =
Math.
Min(mins[1],maxs[1]);
3301 maxTmp[1] =
Math.
Max(mins[1],maxs[1]);
3302 minTmp[2] =
Math.
Min(mins[2],maxs[2]);
3303 maxTmp[2] =
Math.
Max(mins[2],maxs[2]);
3304 mins = minTmp;
3305 maxs = maxTmp;
3306
3307 maxs[1] = maxs[1] + 0.35;
3308
3310 }
3311 }
3312
3315 {
3318
3319
3321 foreach (
EntityAI entity : foundEntities)
3322 {
3325 }
3326 }
3327
3328
3330 {
3332
3336 }
3337
3339 {
3341
3343 {
3345 }
3346 else
3347 {
3349 }
3350
3352 }
3353
3355 {
3357
3359 foreach (
string slotName : attachmentSlots)
3360 {
3362 }
3363
3364
3367 else
3369
3371 }
3372
3374 {
3375 string slotNameMounted = slot_name + "_Mounted";
3376 EntityAI attachment = FindAttachmentBySlotName(slot_name);
3377
3378 if (attachment)
3379 {
3380 BarbedWire barbedWire = BarbedWire.Cast(attachment);
3381 if (barbedWire && barbedWire.IsMounted())
3383 else
3385
3386 if (is_locked)
3387 {
3388 SetAnimationPhase(slotNameMounted, 0);
3389 SetAnimationPhase(slot_name, 1);
3390 }
3391 else
3392 {
3393 SetAnimationPhase(slotNameMounted, 1);
3394 SetAnimationPhase(slot_name, 0);
3395 }
3396 }
3397 else
3398 {
3399 SetAnimationPhase(slotNameMounted, 1);
3400 SetAnimationPhase(slot_name, 1);
3401
3403 }
3404 }
3405
3406
3408 {
3411
3414
3417
3418 foreach (
string slotName : attachmentSlots)
3419 {
3421 }
3422
3423
3425 {
3428
3430 }
3431 else
3432 {
3435
3437 }
3438
3441 }
3442
3444 {
3445
3447 return;
3448
3449 string slot_name_mounted = slot_name + "_Mounted";
3450 EntityAI attachment = FindAttachmentBySlotName( slot_name );
3451
3452
3454 RemoveProxyPhysics( slot_name_mounted );
3455 RemoveProxyPhysics( slot_name );
3456
3457 if ( attachment )
3458 {
3460 if ( is_locked )
3461 {
3463 AddProxyPhysics( slot_name_mounted );
3464 }
3465 else
3466 {
3468 AddProxyPhysics( slot_name );
3469 }
3470 }
3471 }
3472
3474 {
3475 SetAffectPathgraph( true, false );
3477 }
3478
3480 {
3481 return true;
3482 }
3483
3485 {
3486 return true;
3487 }
3488
3490 {
3491 if ( attachment )
3492 {
3494 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
3495
3496 return GetInventory().GetSlotLock( inventory_location.
GetSlot() );
3497 }
3498
3499 return false;
3500 }
3501
3503 {
3505 }
3506
3507
3509 {
3510 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
3511 if (
GetGame().ConfigIsExisting( config_path ) )
3512 {
3514 }
3515 }
3516
3518 {
3519 return true;
3520 }
3521
3523 {
3524 return true;
3525 }
3526
3528 {
3529 return true;
3530 }
3531
3532
3534 {
3536 {
3538 }
3539
3541 }
3542
3544 {
3546 }
3547
3548
3549
3551 {
3552 return super.CanReceiveAttachment(attachment, slotId);
3553 }
3554
3556 {
3557 int attachment_count = GetInventory().AttachmentCount();
3558 if ( attachment_count > 0 )
3559 {
3560 if (
HasBase() && attachment_count == 1 )
3561 {
3562 return false;
3563 }
3564
3565 return true;
3566 }
3567
3568 return false;
3569 }
3570
3572 {
3573 return true;
3574 }
3575
3577 {
3578 return false;
3579 }
3580
3581
3583 {
3584 return false;
3585 }
3586
3588 {
3589 return false;
3590 }
3591
3592
3594 {
3595 return false;
3596 }
3597
3598
3599
3601 {
3602 return true;
3603 }
3604
3606 {
3607 return true;
3608 }
3609
3612 {
3613 return false;
3614 }
3615
3616
3618 {
3619 return true;
3620 }
3621
3622
3624 {
3625 return false;
3626 }
3627
3628
3630 {
3631 return true;
3632 }
3633
3634
3636 {
3637 if (
HasBase() || GetInventory().AttachmentCount() > 0 )
3638 {
3639 return false;
3640 }
3641
3642 return true;
3643 }
3644
3646 {
3649
3650 return item;
3651 }
3652
3653
3655 {
3657 {
3658
3660
3661
3664
3666 if ( MemoryPointExists( slot_name + "_min" ) )
3667 {
3668 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
3669 }
3670 if ( MemoryPointExists( slot_name + "_max" ) )
3671 {
3672 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
3673 }
3674
3675
3678
3679
3682 center = ModelToWorld( center );
3683
3684
3687
3688 areaDamage.SetExtents( extents[0], extents[1] );
3689 areaDamage.SetAreaPosition( center );
3690 areaDamage.SetAreaOrientation( orientation );
3693 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
3694 areaDamage.SetAmmoName( "BarbedWireHit" );
3695 areaDamage.Spawn();
3696
3698 }
3699 }
3700
3702 {
3703 if ( angle_deg != 0 )
3704 {
3705
3706 orientation[0] = orientation[0] - angle_deg;
3707
3708
3710 if ( MemoryPointExists( "rotate_axis" ) )
3711 {
3712 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
3713 }
3714 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];
3715 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];
3716 center[0] = r_center_x;
3717 center[2] = r_center_z;
3718 }
3719 }
3720
3722 {
3724 {
3727 {
3728 if (areaDamage)
3729 {
3730 areaDamage.Destroy();
3731 }
3732
3734 }
3735 }
3736 }
3737
3739 {
3740 return true;
3741 }
3742
3743
3744
3745
3747 {
3749 }
3750
3752 {
3754 }
3755
3757 {
3759 }
3760
3762 {
3764
3765 switch ( material_type )
3766 {
3772 }
3773
3774 return "";
3775 }
3776
3778 {
3780
3781 switch ( material_type )
3782 {
3788 }
3789
3790 return "";
3791 }
3792
3793
3795 {
3797 {
3798
3800 {
3801 SetHealth(slot_name,"Health",item.GetHealth());
3802 }
3803 }
3804 }
3805
3807 {
3808 return 111;
3809 }
3810
3812 {
3813 super.SetActions();
3814
3818 }
3819
3820
3821
3822
3824 {
3825 }
3826
3829 {
3830 return null;
3831 }
3832
3834 {
3836 }
3837
3839 {
3842
3843 Man p;
3844
3845 #ifdef SERVER
3848 if (players.Count())
3849 p = players[0];
3850 #else
3852 #endif
3853
3855 {
3856 bool excluded = false;
3858 if (excludes)
3859 {
3860 foreach (string exclude : excludes)
3861 {
3863 {
3864 excluded = true;
3865 break;
3866 }
3867 }
3868 }
3869
3870 if (!excluded)
3871 {
3873 }
3874 }
3875
3877 }
3878}
3879
3881{
3882#ifdef BSB_DEBUG
3884#else
3885
3886#endif
3887}
3889{
3890#ifdef BSB_DEBUG_SPAM
3892#else
3893
3894#endif
3895}
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.