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; } } }
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(); } }