diff --git a/lib/plugins/src/_internal/external-plugins.ts b/lib/plugins/src/_internal/external-plugins.ts index b9a34c7..21a045a 100644 --- a/lib/plugins/src/_internal/external-plugins.ts +++ b/lib/plugins/src/_internal/external-plugins.ts @@ -7,6 +7,7 @@ import { getErrorStack } from '@revenge-mod/utils/error' import { pUnscopedApi } from '../apis' import { disablePlugin, + forgetInitialPluginState, getInternalPluginMeta, handlePluginError, InternalPluginFlags, @@ -67,6 +68,9 @@ export function registerExternalPlugins() { const { plugin } = result try { + // Drop the stale boot snapshot entry (from before a mid-session uninstall) + // so the fresh install registers disabled + forgetInitialPluginState(plugin.manifest.id) registerExternalPlugin(plugin) } catch (e) { pEmitter.emit('install', { error: toPluginError(e) }) @@ -189,6 +193,9 @@ export async function uninstallExternalPlugin(plugin: AnyPlugin) { await callNativeMethod('revenge.plugins.uninstall', [plugin.manifest.id]) + // Native cleared its persisted flags, drop our boot snapshot entry too + forgetInitialPluginState(plugin.manifest.id) + pList.delete(plugin.manifest.id) pEmitter.emit('unregister', plugin) } diff --git a/lib/plugins/src/_internal/index.ts b/lib/plugins/src/_internal/index.ts index de36a7c..ecaf4a4 100644 --- a/lib/plugins/src/_internal/index.ts +++ b/lib/plugins/src/_internal/index.ts @@ -238,6 +238,10 @@ const { states: InitialPersistedStates }: PersistedPluginStates = states: {}, } +export function forgetInitialPluginState(id: PluginManifest['id']) { + delete InitialPersistedStates[id] +} + // Native is the source of truth, we're expecting dispatches from native to sync states registerJSMethod('revenge.plugins.states.update', (id, state) => { applyPluginFlags(