예제 #1
0
        public static void StoreParameters(VRCAvatarManager manager)
        {
            var api_avatar = manager?.prop_ApiAvatar_0;

            if (api_avatar == null)
            {
                return;
            }

            MelonLogger.Msg($"Storing avatar state for {api_avatar.name}");

            var config = new AvatarSettings
            {
                name       = api_avatar.name,
                version    = api_avatar.version,
                parameters = manager.GetAvatarParameters()?.ToDictionary(o => o.field_Private_String_0, o => new Parameter(o)),
                renderers  = manager.GetAvatarRenderers().Select(o => o.gameObject.active && o.enabled).ToList(),
            };

            var key = api_avatar.id;

            if (settings.ContainsKey(key))
            {
                settings[key] = config;
            }
            else
            {
                settings.Add(key, config);
            }

            /* Prevent override of changed parameters */
            foreach (var parameter in manager.GetAvatarParameters())
            {
                parameter.Lock();
            }
        }
예제 #2
0
        public static void ApplyParameters(VRCAvatarManager manager)
        {
            var api_avatar = manager?.prop_ApiAvatar_0;

            if (api_avatar == null)
            {
                return;
            }

            /* Look up store */
            var key = api_avatar.id;

            if (!settings.ContainsKey(key))
            {
                return;
            }
            var config = settings[key];

            /* Check version */
            if (config.version != api_avatar.version)
            {
                MelonLogger.Msg($"Avatar {api_avatar.name} version missmatch ({config.version} != {api_avatar.version}). Removing");
                settings.Remove(key);
                return;
            }

            MelonLogger.Msg($"Applying avatar state to {api_avatar.name}");

            /* Apply parameters */
            if (config.parameters != null)
            {
                foreach (var parameter in manager.GetAvatarParameters())
                {
                    config.parameters[parameter.field_Private_String_0].Apply(parameter);
                }
            }

            /* Apply Meshes */
            if (config.renderers != null)
            {
                foreach (var element in Enumerable.Zip(config.renderers, manager.GetAvatarRenderers(), (state, renderer) => new { state, renderer }))
                {
                    element.renderer.gameObject.active = element.renderer.enabled = element.state;
                }
            }
        }