From 2d3baff031a242836031ecc332eb6697d0e7ad98 Mon Sep 17 00:00:00 2001 From: Geometrically <18202329+Geometrically@users.noreply.github.com> Date: Mon, 21 Aug 2023 17:39:39 -0400 Subject: [PATCH] Neoforge support (#653) --- Cargo.lock | 6 +-- theseus/src/api/metadata.rs | 8 +++ theseus/src/api/pack/install_from.rs | 5 ++ theseus/src/api/profile/create.rs | 1 + theseus/src/api/profile/mod.rs | 2 +- theseus/src/state/metadata.rs | 8 ++- theseus/src/state/profiles.rs | 3 ++ theseus_cli/src/subcommands/profile.rs | 2 + theseus_gui/src-tauri/src/api/metadata.rs | 7 +++ .../components/ui/InstanceCreationModal.vue | 44 ++++++++++------ theseus_gui/src/helpers/metadata.js | 8 +++ theseus_gui/src/pages/Browse.vue | 4 +- theseus_gui/src/pages/instance/Index.vue | 2 +- theseus_gui/src/pages/instance/Options.vue | 51 ++++++++++++------- 14 files changed, 111 insertions(+), 40 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3a45e7ff2..936c918a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4609,7 +4609,7 @@ dependencies = [ [[package]] name = "theseus" -version = "0.5.2" +version = "0.5.3" dependencies = [ "async-recursion", "async-tungstenite", @@ -4655,7 +4655,7 @@ dependencies = [ [[package]] name = "theseus_cli" -version = "0.5.2" +version = "0.5.3" dependencies = [ "argh", "color-eyre", @@ -4682,7 +4682,7 @@ dependencies = [ [[package]] name = "theseus_gui" -version = "0.5.2" +version = "0.5.3" dependencies = [ "chrono", "cocoa", diff --git a/theseus/src/api/metadata.rs b/theseus/src/api/metadata.rs index 7227ae74c..1a6b56a70 100644 --- a/theseus/src/api/metadata.rs +++ b/theseus/src/api/metadata.rs @@ -33,3 +33,11 @@ pub async fn get_quilt_versions() -> crate::Result { Ok(tags) } + +#[tracing::instrument] +pub async fn get_neoforge_versions() -> crate::Result { + let state = State::get().await?; + let tags = state.metadata.read().await.neoforge.clone(); + + Ok(tags) +} diff --git a/theseus/src/api/pack/install_from.rs b/theseus/src/api/pack/install_from.rs index 7685dfe73..805f782b6 100644 --- a/theseus/src/api/pack/install_from.rs +++ b/theseus/src/api/pack/install_from.rs @@ -69,6 +69,7 @@ pub enum EnvType { #[serde(rename_all = "kebab-case")] pub enum PackDependency { Forge, + NeoForge, FabricLoader, QuiltLoader, Minecraft, @@ -323,6 +324,10 @@ pub async fn set_profile_information( mod_loader = Some(ModLoader::Forge); loader_version = Some(value); } + PackDependency::NeoForge => { + mod_loader = Some(ModLoader::NeoForge); + loader_version = Some(value); + } PackDependency::FabricLoader => { mod_loader = Some(ModLoader::Fabric); loader_version = Some(value); diff --git a/theseus/src/api/profile/create.rs b/theseus/src/api/profile/create.rs index 3289fd035..1cd7e9ce0 100644 --- a/theseus/src/api/profile/create.rs +++ b/theseus/src/api/profile/create.rs @@ -180,6 +180,7 @@ pub(crate) async fn get_loader_version_from_loader( ModLoader::Forge => &metadata.forge, ModLoader::Fabric => &metadata.fabric, ModLoader::Quilt => &metadata.quilt, + ModLoader::NeoForge => &metadata.neoforge, _ => { return Err( ProfileCreationError::NoManifest(loader.to_string()).into() diff --git a/theseus/src/api/profile/mod.rs b/theseus/src/api/profile/mod.rs index 2c34e00d2..ff1c66b4f 100644 --- a/theseus/src/api/profile/mod.rs +++ b/theseus/src/api/profile/mod.rs @@ -1049,7 +1049,7 @@ fn sanitize_loader_version_string(s: &str, loader: PackDependency) -> &str { // If two or more, take the second // If one, take the first // If none, take the whole thing - PackDependency::Forge => { + PackDependency::Forge | PackDependency::NeoForge => { let mut split: std::str::Split<'_, char> = s.split('-'); match split.next() { Some(first) => match split.next() { diff --git a/theseus/src/state/metadata.rs b/theseus/src/state/metadata.rs index 96d190bbe..e7da01398 100644 --- a/theseus/src/state/metadata.rs +++ b/theseus/src/state/metadata.rs @@ -18,6 +18,7 @@ pub struct Metadata { pub forge: LoaderManifest, pub fabric: LoaderManifest, pub quilt: LoaderManifest, + pub neoforge: LoaderManifest, } impl Metadata { @@ -26,7 +27,7 @@ impl Metadata { } pub async fn fetch() -> crate::Result { - let (minecraft, forge, fabric, quilt) = tokio::try_join! { + let (minecraft, forge, fabric, quilt, neoforge) = tokio::try_join! { async { let url = Self::get_manifest("minecraft"); fetch_version_manifest(Some(&url)).await @@ -42,6 +43,10 @@ impl Metadata { async { let url = Self::get_manifest("quilt"); fetch_loader_manifest(&url).await + }, + async { + let url = Self::get_manifest("neo"); + fetch_loader_manifest(&url).await } }?; @@ -50,6 +55,7 @@ impl Metadata { forge, fabric, quilt, + neoforge, }) } diff --git a/theseus/src/state/profiles.rs b/theseus/src/state/profiles.rs index b67072a74..9bcaeef25 100644 --- a/theseus/src/state/profiles.rs +++ b/theseus/src/state/profiles.rs @@ -205,6 +205,7 @@ pub enum ModLoader { Forge, Fabric, Quilt, + NeoForge, } impl std::fmt::Display for ModLoader { @@ -214,6 +215,7 @@ impl std::fmt::Display for ModLoader { Self::Forge => "Forge", Self::Fabric => "Fabric", Self::Quilt => "Quilt", + Self::NeoForge => "NeoForge", }) } } @@ -225,6 +227,7 @@ impl ModLoader { Self::Forge => "forge", Self::Fabric => "fabric", Self::Quilt => "quilt", + Self::NeoForge => "neoforge", } } } diff --git a/theseus_cli/src/subcommands/profile.rs b/theseus_cli/src/subcommands/profile.rs index b6d506edf..0d046aefd 100644 --- a/theseus_cli/src/subcommands/profile.rs +++ b/theseus_cli/src/subcommands/profile.rs @@ -364,6 +364,8 @@ fn modloader_from_str(it: &str) -> core::result::Result { "vanilla" => Ok(ModLoader::Vanilla), "forge" => Ok(ModLoader::Forge), "fabric" => Ok(ModLoader::Fabric), + "quilt" => Ok(ModLoader::Quilt), + "neoforge" => Ok(ModLoader::NeoForge), _ => Err(String::from("Invalid modloader: {it}")), } } diff --git a/theseus_gui/src-tauri/src/api/metadata.rs b/theseus_gui/src-tauri/src/api/metadata.rs index dd2246b7e..7da659b4a 100644 --- a/theseus_gui/src-tauri/src/api/metadata.rs +++ b/theseus_gui/src-tauri/src/api/metadata.rs @@ -9,6 +9,7 @@ pub fn init() -> tauri::plugin::TauriPlugin { metadata_get_fabric_versions, metadata_get_forge_versions, metadata_get_quilt_versions, + metadata_get_neoforge_versions, ]) .build() } @@ -36,3 +37,9 @@ pub async fn metadata_get_forge_versions() -> Result { pub async fn metadata_get_quilt_versions() -> Result { Ok(theseus::metadata::get_quilt_versions().await?) } + +/// Gets the quilt versions from daedalus +#[tauri::command] +pub async fn metadata_get_neoforge_versions() -> Result { + Ok(theseus::metadata::get_neoforge_versions().await?) +} diff --git a/theseus_gui/src/components/ui/InstanceCreationModal.vue b/theseus_gui/src/components/ui/InstanceCreationModal.vue index 1c6d9e1a5..a8a4c6e79 100644 --- a/theseus_gui/src/components/ui/InstanceCreationModal.vue +++ b/theseus_gui/src/components/ui/InstanceCreationModal.vue @@ -216,6 +216,7 @@ import { get_fabric_versions, get_forge_versions, get_quilt_versions, + get_neoforge_versions, } from '@/helpers/metadata' import { handleError } from '@/store/notifications.js' import Multiselect from 'vue-multiselect' @@ -293,21 +294,28 @@ onUnmounted(() => { } }) -const [fabric_versions, forge_versions, quilt_versions, all_game_versions, loaders] = - await Promise.all([ - get_fabric_versions().then(shallowRef).catch(handleError), - get_forge_versions().then(shallowRef).catch(handleError), - get_quilt_versions().then(shallowRef).catch(handleError), - get_game_versions().then(shallowRef).catch(handleError), - get_loaders() - .then((value) => - value - .filter((item) => item.supported_project_types.includes('modpack')) - .map((item) => item.name.toLowerCase()) - ) - .then(ref) - .catch(handleError), - ]) +const [ + fabric_versions, + forge_versions, + quilt_versions, + neoforge_versions, + all_game_versions, + loaders, +] = await Promise.all([ + get_fabric_versions().then(shallowRef).catch(handleError), + get_forge_versions().then(shallowRef).catch(handleError), + get_quilt_versions().then(shallowRef).catch(handleError), + get_neoforge_versions().then(shallowRef).catch(handleError), + get_game_versions().then(shallowRef).catch(handleError), + get_loaders() + .then((value) => + value + .filter((item) => item.supported_project_types.includes('modpack')) + .map((item) => item.name.toLowerCase()) + ) + .then(ref) + .catch(handleError), +]) loaders.value.unshift('vanilla') const game_versions = computed(() => { @@ -320,6 +328,8 @@ const game_versions = computed(() => { defaultVal &= forge_versions.value.gameVersions.some((x) => item.id === x.id) } else if (loader.value === 'quilt') { defaultVal &= quilt_versions.value.gameVersions.some((x) => item.id === x.id) + } else if (loader.value === 'neoforge') { + defaultVal &= neoforge_versions.value.gameVersions.some((x) => item.id === x.id) } return defaultVal @@ -394,6 +404,10 @@ const selectable_versions = computed(() => { .loaders.map((item) => item.id) } else if (loader.value === 'quilt') { return quilt_versions.value.gameVersions[0].loaders.map((item) => item.id) + } else if (loader.value === 'neoforge') { + return neoforge_versions.value.gameVersions + .find((item) => item.id === game_version.value) + .loaders.map((item) => item.id) } } return [] diff --git a/theseus_gui/src/helpers/metadata.js b/theseus_gui/src/helpers/metadata.js index 11f424ff6..ae64baa51 100644 --- a/theseus_gui/src/helpers/metadata.js +++ b/theseus_gui/src/helpers/metadata.js @@ -29,3 +29,11 @@ export async function get_quilt_versions() { console.log('Getting quilt versions', c) return c } + +// Gets the neoforge versions from daedalus +// Returns Manifest +export async function get_neoforge_versions() { + const c = await invoke('plugin:metadata|metadata_get_neoforge_versions') + console.log('Getting neoforge versions', c) + return c +} diff --git a/theseus_gui/src/pages/Browse.vue b/theseus_gui/src/pages/Browse.vue index e13ef5795..c392ddd51 100644 --- a/theseus_gui/src/pages/Browse.vue +++ b/theseus_gui/src/pages/Browse.vue @@ -179,7 +179,7 @@ async function refreshSearch() { formattedFacets.push(orFacets.value) } else if (projectType.value === 'mod') { formattedFacets.push( - ['forge', 'fabric', 'quilt'].map((x) => `categories:'${encodeURIComponent(x)}'`) + ['forge', 'fabric', 'quilt', 'neoforge'].map((x) => `categories:'${encodeURIComponent(x)}'`) ) } else if (projectType.value === 'datapack') { formattedFacets.push(['datapack'].map((x) => `categories:'${encodeURIComponent(x)}'`)) @@ -601,7 +601,7 @@ onUnmounted(() => unlistenOffline()) v-for="loader in loaders.filter( (l) => (projectType !== 'mod' && l.supported_project_types?.includes(projectType)) || - (projectType === 'mod' && ['fabric', 'forge', 'quilt'].includes(l.name)) + (projectType === 'mod' && ['fabric', 'forge', 'quilt', 'neoforge'].includes(l.name)) )" :key="loader" > diff --git a/theseus_gui/src/pages/instance/Index.vue b/theseus_gui/src/pages/instance/Index.vue index ee70e76f5..260c5355b 100644 --- a/theseus_gui/src/pages/instance/Index.vue +++ b/theseus_gui/src/pages/instance/Index.vue @@ -61,7 +61,7 @@
- Mods + Content diff --git a/theseus_gui/src/pages/instance/Options.vue b/theseus_gui/src/pages/instance/Options.vue index baa964ff9..08b84aca0 100644 --- a/theseus_gui/src/pages/instance/Options.vue +++ b/theseus_gui/src/pages/instance/Options.vue @@ -405,7 +405,12 @@ import { get } from '@/helpers/settings.js' import JavaSelector from '@/components/ui/JavaSelector.vue' import { convertFileSrc } from '@tauri-apps/api/tauri' import { open } from '@tauri-apps/api/dialog' -import { get_fabric_versions, get_forge_versions, get_quilt_versions } from '@/helpers/metadata.js' +import { + get_fabric_versions, + get_forge_versions, + get_neoforge_versions, + get_quilt_versions, +} from '@/helpers/metadata.js' import { get_game_versions, get_loaders } from '@/helpers/tags.js' import { handleError } from '@/store/notifications.js' import { mixpanel_track } from '@/helpers/mixpanel' @@ -618,21 +623,28 @@ async function removeProfile() { const changeVersionsModal = ref(null) const showSnapshots = ref(false) -const [fabric_versions, forge_versions, quilt_versions, all_game_versions, loaders] = - await Promise.all([ - get_fabric_versions().then(shallowRef).catch(handleError), - get_forge_versions().then(shallowRef).catch(handleError), - get_quilt_versions().then(shallowRef).catch(handleError), - get_game_versions().then(shallowRef).catch(handleError), - get_loaders() - .then((value) => - value - .filter((item) => item.supported_project_types.includes('modpack')) - .map((item) => item.name.toLowerCase()) - ) - .then(ref) - .catch(handleError), - ]) +const [ + fabric_versions, + forge_versions, + quilt_versions, + neoforge_versions, + all_game_versions, + loaders, +] = await Promise.all([ + get_fabric_versions().then(shallowRef).catch(handleError), + get_forge_versions().then(shallowRef).catch(handleError), + get_quilt_versions().then(shallowRef).catch(handleError), + get_neoforge_versions().then(shallowRef).catch(handleError), + get_game_versions().then(shallowRef).catch(handleError), + get_loaders() + .then((value) => + value + .filter((item) => item.supported_project_types.includes('modpack')) + .map((item) => item.name.toLowerCase()) + ) + .then(ref) + .catch(handleError), +]) loaders.value.unshift('vanilla') const loader = ref(props.instance.metadata.loader) @@ -647,6 +659,8 @@ const selectableGameVersions = computed(() => { defaultVal &= forge_versions.value.gameVersions.some((x) => item.version === x.id) } else if (loader.value === 'quilt') { defaultVal &= quilt_versions.value.gameVersions.some((x) => item.version === x.id) + } else if (loader.value === 'neoforge') { + defaultVal &= neoforge_versions.value.gameVersions.some((x) => item.version === x.id) } return defaultVal @@ -662,6 +676,9 @@ const selectableLoaderVersions = computed(() => { return forge_versions.value.gameVersions.find((item) => item.id === gameVersion.value).loaders } else if (loader.value === 'quilt') { return quilt_versions.value.gameVersions[0].loaders + } else if (loader.value === 'neoforge') { + return neoforge_versions.value.gameVersions.find((item) => item.id === gameVersion.value) + .loaders } } return [] @@ -683,7 +700,7 @@ const isChanged = computed(() => { return ( loader.value != props.instance.metadata.loader || gameVersion.value != props.instance.metadata.game_version || - JSON.stringify(selectableLoaderVersions.value[loaderVersionIndex.value]) != + JSON.stringify(selectableLoaderVersions.value[loaderVersionIndex.value]) !== JSON.stringify(props.instance.metadata.loader_version) ) })