Beispiel #1
0
        private void ReadHairInfos()
        {
            for (var i = 0; i < 100; i++)
            {
                var key = $"HAIR_INFO_{i}";

                var pedModel = Settings.GetValue(key, "TARGET_MODEL", string.Empty);
                if (string.IsNullOrEmpty(pedModel)) // ped not even defined.
                {
                    continue;
                }

                var hash = Game.GenerateHash(pedModel);
                if (hash == 0)
                {
                    continue;
                }

                var var       = Settings.GetValue(key, "PED_VARIATION", PedVariationData.PED_VARIATION_HAIR);
                var wdi       = Settings.GetValue(key, "WET_DRAW_INDEX", (uint)1);
                var wti       = Settings.GetValue(key, "WET_TEX_INDEX", (uint)0);
                var ddi       = Settings.GetValue(key, "DRY_DRAW_INDEX", (uint)0);
                var dti       = Settings.GetValue(key, "DRY_TEX_INDEX", (uint)0);
                var dur       = Settings.GetValue(key, "WETNESS_DURATION", 30.0f);
                var rain      = Settings.GetValue(key, "ALLOW_RAIN_WETNESS", false);
                var minDepth  = Settings.GetValue(key, "MIN_DEPTH", 0.5f);
                var depthBone = Settings.GetValue(key, "DEPTH_CHECK_BONE_ID", (int)Bone.SKEL_Head);

                var varInfo = new VariationInfo(hash, var, wdi, wti, ddi, dti, dur, rain, minDepth, depthBone);
                _variationInfos.Add(varInfo);
            }
        }
Beispiel #2
0
        private void OnTick(object sender, EventArgs eventArgs)
        {
            Ped           playerPed = Game.Player.Character;
            int           model     = playerPed.Model.Hash;
            VariationInfo v         = null;

            foreach (var var in _variationInfos)
            {
                if (var.ModelHash != model)
                {
                    continue;
                }
                v = var;
                break;
            }
            if (v == null)
            {
                return;
            }

            bool isWeather    = (World.Weather == Weather.Raining || World.Weather == Weather.ThunderStorm) && v.AllowRain;
            bool isUnderwater = playerPed.IsSwimmingUnderWater || (playerPed.IsSwimming && playerPed.IsSprinting);
            bool isHeadWet    = (isWeather || isUnderwater) && !playerPed.IsWearingHelmet;

            if (isHeadWet)
            {
                if (_isWatered)
                {
                    return;
                }

                var boneCoord = playerPed.GetBoneCoord((Bone)v.DepthBone);
                if (boneCoord != Vector3.Zero)
                {
                    unsafe
                    {
                        float depth = 0f;
                        Function.Call(Hash.GET_WATER_HEIGHT, boneCoord.X, boneCoord.Y, boneCoord.Z, &depth);
                        depth = Math.Max(depth - boneCoord.Z, 0f);

                        if (depth < v.MinDepth)
                        {
                            return;
                        }
                    }
                }

                Function.Call(Hash.SET_PED_COMPONENT_VARIATION, playerPed, (uint)v.Variation, v.WetDrawableIndex,
                              v.WetTextureIndex, 0);

                v.ResetTimer();
                _isWatered = true;
            }
            else
            {
                if (!_isWatered)
                {
                    return;
                }
                if (v.m_WetnessTimer > 0)
                {
                    v.m_WetnessTimer -= Game.LastFrameTime;
                    return;
                }
                Function.Call(Hash.SET_PED_COMPONENT_VARIATION, playerPed, (uint)v.Variation,
                              v.DryDrawableIndex, v.DryTextureIndex, 0);
                _isWatered = false;
            }
        }