From 750ecd414ed4aaa4d1cf670f320d019821bc24d1 Mon Sep 17 00:00:00 2001 From: LynithDev <61880709+LynithDev@users.noreply.github.com> Date: Sun, 24 Mar 2024 22:09:04 +0100 Subject: [PATCH] chore: Start work on creating instances (MC Manifest argument deserializing needs to be fixed) --- core/src/game/minecraft.rs | 57 +++++++++++++++++++++++++++-- src-tauri/src/launcher_core/game.rs | 2 +- src/bridge/game.ts | 18 +++++++++ src/ui/pages/Home.tsx | 49 ++++++++++++++++++++++--- 4 files changed, 116 insertions(+), 10 deletions(-) diff --git a/core/src/game/minecraft.rs b/core/src/game/minecraft.rs index 6d1c474e..d453ee2d 100644 --- a/core/src/game/minecraft.rs +++ b/core/src/game/minecraft.rs @@ -1,4 +1,5 @@ use serde::{Serialize, Deserialize}; +use serde_json::Value; #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -11,12 +12,47 @@ pub struct MinecraftManifest { pub libraries: Vec, pub logging: Logging, pub main_class: String, - pub minecraft_arguments: String, + pub arguments: Arguments, pub release_time: String, #[serde(rename = "type")] pub release_type: ReleaseType, } +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +#[serde(untagged)] +pub enum Arguments { + // TODO: https://serde.rs/string-or-struct.html + MinecraftArguments(String), + Arguments { + game: Vec, + jvm: Vec, + } +} + +impl Default for Arguments { + fn default() -> Self { Arguments::MinecraftArguments(String::new()) } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +#[serde(untagged)] +pub enum ModernArgumentsItem { + Simple(String), + Rule { + rules: Vec, + value: ArgumentRuleValue, + }, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +#[serde(untagged)] +pub enum ArgumentRuleValue { + String(String), + List(Vec), +} + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub enum ReleaseType { @@ -109,19 +145,32 @@ pub struct Native { pub url: String, } -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Rule { - pub action: String, + pub action: RuleAction, #[serde(skip_serializing_if = "Option::is_none")] pub os: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub features: Option, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +#[serde(untagged)] +pub enum RuleAction { + Allow, + Disallow, } #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Os { - pub name: String, + pub name: Option, + pub arch: Option, + pub version: Option, } #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] diff --git a/src-tauri/src/launcher_core/game.rs b/src-tauri/src/launcher_core/game.rs index 5696adf4..df1e7a09 100644 --- a/src-tauri/src/launcher_core/game.rs +++ b/src-tauri/src/launcher_core/game.rs @@ -10,9 +10,9 @@ pub async fn create_instance( state: State<'_, Mutex>, name: String, version: String, + client: ClientType, cover: Option, group: Option, - client: ClientType ) -> Result { let manager = &mut state.lock().await.client_manager; let uuid = manager.create_instance(name, version, cover, group, client).await?; diff --git a/src/bridge/game.ts b/src/bridge/game.ts index f71a576f..8b01a817 100644 --- a/src/bridge/game.ts +++ b/src/bridge/game.ts @@ -25,6 +25,24 @@ export async function getInstances(): Promise { return await invoke('plugin:launcher-core|get_instances'); } +export async function createInstance(instance: Omit & { version: string }): Promise { + return await invoke( + 'plugin:launcher-core|create_instance', + { + name: instance.name, + version: instance.version, + client: instance.client, + // cover: instance.cover, + // group: instance.group, + }, + { + headers: { + Accept: 'text/plain', + }, + }, + ); +} + export async function refreshClientManager(): Promise { return await invoke('plugin:launcher-core|refresh_client_manager'); } diff --git a/src/ui/pages/Home.tsx b/src/ui/pages/Home.tsx index 231849ad..0719d563 100644 --- a/src/ui/pages/Home.tsx +++ b/src/ui/pages/Home.tsx @@ -19,7 +19,7 @@ import Tag from '../components/base/Tag'; import TextField from '../components/base/TextField'; import defaultCover from '../../assets/images/default_instance_cover.jpg'; import ContextMenu from '../components/overlay/ContextMenu'; -import { getInstancesWithManifests, refreshClientManager } from '../../bridge/game'; +import { createInstance, getInstancesWithManifests, refreshClientManager } from '../../bridge/game'; // TODO: Replace this into it's own component function OneConfigLogo() { @@ -261,13 +261,37 @@ function InstanceGroup(props: InstanceGroupProps) { const Instances = lazy(async () => { const instances = await getInstancesWithManifests(); + const map = new Map(); + + instances.forEach((instance) => { + const groupName = instance.instance.group || 'Unnamed'; + + if (map.has(groupName)) + map.get(groupName)!.push(instance); + else + map.set(groupName, [instance]); + }); return { - default: () => , + default: () => Array.from(map.entries()).map(([title, instances]) => ( + + )), }; }); function HomePage() { + function newInstance() { + createInstance({ + name: 'New Instance', + version: '1.19.2', + client: { + type: 'Vanilla', + }, + cover: null, + group: null, + }); + } + return (
@@ -277,9 +301,24 @@ function HomePage() { } placeholder="Search for something..." />
- - -