fabric installing, sorta...
This commit is contained in:
parent
d0384b1778
commit
859bf812cd
@ -26,6 +26,8 @@ type Instance struct {
|
||||
FabricVersion string
|
||||
QuiltVersion string
|
||||
JavaVersion int
|
||||
Libraries []string
|
||||
MainClass string
|
||||
}
|
||||
|
||||
type InstanceManager struct {
|
||||
@ -187,9 +189,10 @@ func (i *InstanceManager)InstallVanilla(version string, instanceName string) {
|
||||
if err != nil {
|
||||
fmt.Printf("unable to create directory: %s\n", err)
|
||||
}
|
||||
|
||||
|
||||
instance := Instance{InstanceName: instanceName, MinecraftVersion: version, JavaVersion: metadata.JavaVersion.MajorVersion}
|
||||
instance := Instance{InstanceName: instanceName, MinecraftVersion: version, JavaVersion: metadata.JavaVersion.MajorVersion, MainClass: metadata.MainClass}
|
||||
for _, lib := range metadata.Libraries {
|
||||
instance.Libraries = append(instance.Libraries, lib.Downloads.Artifact.Path)
|
||||
}
|
||||
data, err := json.Marshal(instance)
|
||||
if err != nil {
|
||||
fmt.Printf("unable to marshal json data: %s\n", err)
|
||||
@ -242,11 +245,7 @@ func (i *InstanceManager)CheckUpdate(instance Instance){
|
||||
i.SearchInstances()
|
||||
}
|
||||
|
||||
func (i *InstanceManager)LaunchInstance(instance string) {
|
||||
dir, err := os.UserConfigDir()
|
||||
if err != nil {
|
||||
fmt.Printf("unable to get config directory\n")
|
||||
}
|
||||
func (i *InstanceManager)GetInstance(instance string) (Instance, error) {
|
||||
instanceObject := Instance{}
|
||||
found := false
|
||||
for _, inst := range i.instances {
|
||||
@ -257,7 +256,19 @@ func (i *InstanceManager)LaunchInstance(instance string) {
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
fmt.Printf("unable to find instance %s\n", instance)
|
||||
return Instance{}, fmt.Errorf("unable to find instance %s\n", instance)
|
||||
}
|
||||
return instanceObject, nil
|
||||
}
|
||||
|
||||
func (i *InstanceManager)LaunchInstance(instance string) {
|
||||
dir, err := os.UserConfigDir()
|
||||
if err != nil {
|
||||
fmt.Printf("unable to get config directory\n")
|
||||
}
|
||||
instanceObject, err := i.GetInstance(instance)
|
||||
if err != nil {
|
||||
fmt.Printf("Unable to find instance\n")
|
||||
}
|
||||
execName := "java"
|
||||
suffix := "lin"
|
||||
@ -271,7 +282,7 @@ func (i *InstanceManager)LaunchInstance(instance string) {
|
||||
fmt.Printf("unable to authenticate: %s\n", err)
|
||||
return
|
||||
}
|
||||
args, err := GetOnlineLaunchArgs(instanceObject.MinecraftVersion, filepath.Join(dir, "lib"), filepath.Join(dir, "bin"), filepath.Join(dir, "assets"), filepath.Join(dir, "instances", instance, "minecraft"), auth)
|
||||
args, err := GetOnlineLaunchArgs(instanceObject.MinecraftVersion, instanceObject, filepath.Join(dir, "lib"), filepath.Join(dir, "bin"), filepath.Join(dir, "assets"), filepath.Join(dir, "instances", instance, "minecraft"), auth)
|
||||
if err != nil {
|
||||
fmt.Printf("unable to get launch args: %s\n", err)
|
||||
}
|
||||
@ -283,3 +294,64 @@ func (i *InstanceManager)LaunchInstance(instance string) {
|
||||
fmt.Printf("Command Output: %s\n", data)
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (i *InstanceManager)InstallFabric(instance string, fabricVersion string) {
|
||||
i.app.Status("Installing Fabric")
|
||||
instanceObject, err := i.GetInstance(instance)
|
||||
if err != nil {
|
||||
fmt.Printf("Instance does not exist\n")
|
||||
}
|
||||
metadata, err := GetFabricMetadata(instanceObject.MinecraftVersion, fabricVersion)
|
||||
if err != nil {
|
||||
fmt.Printf("unable to get version metadata\n")
|
||||
}
|
||||
for _, lib := range metadata.LauncherMeta.Libraries.Client {
|
||||
tokens := strings.SplitN(lib.Name, ".", 2)
|
||||
org1 := tokens[0]
|
||||
tokens = strings.Split(tokens[1], ":")
|
||||
org2 := tokens[0]
|
||||
pack := tokens[1]
|
||||
version := tokens[2]
|
||||
instanceObject.Libraries = append(instanceObject.Libraries, filepath.Join(org1, org2, pack, version, pack+"-"+version+".jar"))
|
||||
}
|
||||
for _, lib := range metadata.LauncherMeta.Libraries.Common {
|
||||
tokens := strings.SplitN(lib.Name, ".", 2)
|
||||
org1 := tokens[0]
|
||||
tokens = strings.Split(tokens[1], ":")
|
||||
org2 := tokens[0]
|
||||
pack := tokens[1]
|
||||
version := tokens[2]
|
||||
instanceObject.Libraries = append(instanceObject.Libraries, filepath.Join(org1, org2, pack, version, pack+"-"+version+".jar"))
|
||||
}
|
||||
tokens := strings.SplitN(metadata.Loader.Maven, ".", 2)
|
||||
org1 := tokens[0]
|
||||
tokens = strings.Split(tokens[1], ":")
|
||||
org2 := tokens[0]
|
||||
pack := tokens[1]
|
||||
version := tokens[2]
|
||||
instanceObject.Libraries = append(instanceObject.Libraries, filepath.Join(org1, org2, pack, version, pack+"-"+version+".jar"))
|
||||
|
||||
tokens = strings.SplitN(metadata.Intermediary.Maven, ".", 2)
|
||||
org1 = tokens[0]
|
||||
tokens = strings.Split(tokens[1], ":")
|
||||
org2 = tokens[0]
|
||||
pack = tokens[1]
|
||||
version = tokens[2]
|
||||
instanceObject.Libraries = append(instanceObject.Libraries, filepath.Join(org1, org2, pack, version, pack+"-"+version+".jar"))
|
||||
|
||||
instanceObject.MainClass = metadata.LauncherMeta.MainClass["client"]
|
||||
instanceObject.FabricVersion = fabricVersion
|
||||
dir, _ := os.UserConfigDir()
|
||||
InstallFabricLibs(instanceObject.MinecraftVersion, fabricVersion, filepath.Join(dir, "FCLauncher", "lib"))
|
||||
f, _ := os.OpenFile(filepath.Join(dir, "FCLauncher", "instances", instance, "instance.json"), os.O_CREATE|os.O_RDWR, 0755)
|
||||
data, _ := json.Marshal(instanceObject)
|
||||
defer f.Close()
|
||||
f.Write(data)
|
||||
for ind, inst := range i.instances {
|
||||
if inst.InstanceName == instance {
|
||||
i.instances[ind] = instanceObject
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,15 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"crypto/sha1"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Fabric struct {
|
||||
@ -23,6 +28,7 @@ type FabricDefinition struct {
|
||||
type FabricLibrary struct {
|
||||
Name string
|
||||
Url string
|
||||
Sha1 string
|
||||
}
|
||||
|
||||
type FabricLibraries struct {
|
||||
@ -52,6 +58,58 @@ func (Fabric)GetFabricVersions(mcVersion string) ([]FabricVersion, error) {
|
||||
data, _ := io.ReadAll(resp.Body)
|
||||
versions := []FabricVersion{}
|
||||
json.Unmarshal(data, &versions)
|
||||
fmt.Printf("fabric versions found for %s: %+v\n", mcVersion, versions)
|
||||
return versions, nil
|
||||
}
|
||||
|
||||
func GetFabricMetadata(mcVersion string, fabricVersion string) (FabricVersion, error) {
|
||||
versions, err := Fabric{}.GetFabricVersions(mcVersion)
|
||||
if err != nil {
|
||||
return FabricVersion{}, fmt.Errorf("unable to download versions manifest: %e\n", err)
|
||||
}
|
||||
for _, version := range versions {
|
||||
if version.Loader.Version == fabricVersion {
|
||||
return version, nil
|
||||
}
|
||||
}
|
||||
return FabricVersion{}, fmt.Errorf("Unable to find requested version.\n")
|
||||
}
|
||||
|
||||
func InstallLib(lib FabricLibrary, libDir string) {
|
||||
tokens := strings.SplitN(lib.Name, ".", 2)
|
||||
org1 := tokens[0]
|
||||
tokens = strings.Split(tokens[1], ":")
|
||||
org2 := tokens[0]
|
||||
pack := tokens[1]
|
||||
version := tokens[2]
|
||||
path := filepath.Join(org1, org2, pack, version, pack+"-"+version+".jar")
|
||||
if _, err := os.Stat(filepath.Join(libDir, path)); err == nil {
|
||||
f, _ := os.OpenFile(filepath.Join(libDir, path), os.O_RDONLY, 0755)
|
||||
defer f.Close()
|
||||
data, _ := io.ReadAll(f)
|
||||
sha := sha1.Sum(data)
|
||||
if hex.EncodeToString(sha[:20]) == lib.Sha1 {
|
||||
return
|
||||
}
|
||||
}
|
||||
resp, err := http.Get(lib.Url+path)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
os.MkdirAll(filepath.Join(libDir, org1, org2, pack, version), 0755)
|
||||
f, _ := os.OpenFile(filepath.Join(libDir, path), os.O_CREATE|os.O_RDWR, 0755)
|
||||
defer f.Close()
|
||||
io.Copy(f, resp.Body)
|
||||
}
|
||||
|
||||
func InstallFabricLibs(mcVersion string, fabricVersion string, libDir string) {
|
||||
metadata, _ := GetFabricMetadata(mcVersion, fabricVersion)
|
||||
for _, lib := range metadata.LauncherMeta.Libraries.Client {
|
||||
InstallLib(lib, libDir)
|
||||
}
|
||||
for _, lib := range metadata.LauncherMeta.Libraries.Common {
|
||||
InstallLib(lib, libDir)
|
||||
}
|
||||
InstallLib(FabricLibrary{Name: metadata.Loader.Maven, Sha1: "", Url: "https://maven.fabricmc.net/"}, libDir)
|
||||
InstallLib(FabricLibrary{Name: metadata.Intermediary.Maven, Sha1: "", Url: "https://maven.fabricmc.net/"}, libDir)
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
<script lang="ts">
|
||||
import {GetModpacks, GetModpack} from '../wailsjs/go/main/ModpackManager.js'
|
||||
import {InstallVanilla, LaunchInstance, GetInstances, CheckUpdate} from '../wailsjs/go/main/InstanceManager.js'
|
||||
import {InstallVanilla, LaunchInstance, GetInstances, InstallFabric, CheckUpdate} from '../wailsjs/go/main/InstanceManager.js'
|
||||
import {GetVersions} from '../wailsjs/go/main/App.js'
|
||||
import {GetFabricVersions} from '../wailsjs/go/main/Fabric.js'
|
||||
import {onMount} from 'svelte'
|
||||
@ -32,6 +31,7 @@
|
||||
|
||||
function updateLoaders(){
|
||||
GetFabricVersions(pack).then((result) => {
|
||||
fab_versions = []
|
||||
result.forEach((ver) => {
|
||||
fab_versions.push(ver.Loader.Version)
|
||||
})
|
||||
@ -53,9 +53,20 @@
|
||||
function install(){
|
||||
$loading = true
|
||||
InstallVanilla(pack, name).then(() => {
|
||||
switch (loader){
|
||||
case "none":
|
||||
addingInstance = false
|
||||
$loading = false
|
||||
updateLists()
|
||||
break
|
||||
case "fabric":
|
||||
InstallFabric(name, fabric_ver).then(() => {
|
||||
addingInstance = false
|
||||
$loading = false
|
||||
updateLists()
|
||||
})
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -4,8 +4,12 @@ import {main} from '../models';
|
||||
|
||||
export function CheckUpdate(arg1:main.Instance):Promise<void>;
|
||||
|
||||
export function GetInstance(arg1:string):Promise<main.Instance>;
|
||||
|
||||
export function GetInstances():Promise<Array<main.Instance>>;
|
||||
|
||||
export function InstallFabric(arg1:string,arg2:string):Promise<void>;
|
||||
|
||||
export function InstallModpack(arg1:main.Modpack,arg2:string):Promise<void>;
|
||||
|
||||
export function InstallVanilla(arg1:string,arg2:string):Promise<void>;
|
||||
|
@ -6,10 +6,18 @@ export function CheckUpdate(arg1) {
|
||||
return window['go']['main']['InstanceManager']['CheckUpdate'](arg1);
|
||||
}
|
||||
|
||||
export function GetInstance(arg1) {
|
||||
return window['go']['main']['InstanceManager']['GetInstance'](arg1);
|
||||
}
|
||||
|
||||
export function GetInstances() {
|
||||
return window['go']['main']['InstanceManager']['GetInstances']();
|
||||
}
|
||||
|
||||
export function InstallFabric(arg1, arg2) {
|
||||
return window['go']['main']['InstanceManager']['InstallFabric'](arg1, arg2);
|
||||
}
|
||||
|
||||
export function InstallModpack(arg1, arg2) {
|
||||
return window['go']['main']['InstanceManager']['InstallModpack'](arg1, arg2);
|
||||
}
|
||||
|
@ -23,6 +23,7 @@ export namespace main {
|
||||
export class FabricLibrary {
|
||||
Name: string;
|
||||
Url: string;
|
||||
Sha1: string;
|
||||
|
||||
static createFrom(source: any = {}) {
|
||||
return new FabricLibrary(source);
|
||||
@ -32,6 +33,7 @@ export namespace main {
|
||||
if ('string' === typeof source) source = JSON.parse(source);
|
||||
this.Name = source["Name"];
|
||||
this.Url = source["Url"];
|
||||
this.Sha1 = source["Sha1"];
|
||||
}
|
||||
}
|
||||
export class FabricLibraries {
|
||||
@ -147,6 +149,8 @@ export namespace main {
|
||||
FabricVersion: string;
|
||||
QuiltVersion: string;
|
||||
JavaVersion: number;
|
||||
Libraries: string[];
|
||||
MainClass: string;
|
||||
|
||||
static createFrom(source: any = {}) {
|
||||
return new Instance(source);
|
||||
@ -163,6 +167,8 @@ export namespace main {
|
||||
this.FabricVersion = source["FabricVersion"];
|
||||
this.QuiltVersion = source["QuiltVersion"];
|
||||
this.JavaVersion = source["JavaVersion"];
|
||||
this.Libraries = source["Libraries"];
|
||||
this.MainClass = source["MainClass"];
|
||||
}
|
||||
}
|
||||
export class Version {
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@ -516,7 +516,7 @@ func DownloadExecutable(mcVersion string, binDir string, a App) error {
|
||||
|
||||
}
|
||||
|
||||
func GetBaseLaunchArgs(mcVersion string, libDir string, binDir string, assetDir string, gameDir string) ([]string, error) {
|
||||
func GetBaseLaunchArgs(mcVersion string, instance Instance, libDir string, binDir string, assetDir string, gameDir string) ([]string, error) {
|
||||
args := []string{}
|
||||
metadata, err := GetVersionMetadata(mcVersion)
|
||||
if err != nil {
|
||||
@ -547,15 +547,15 @@ func GetBaseLaunchArgs(mcVersion string, libDir string, binDir string, assetDir
|
||||
if runtime.GOOS == "windows" {
|
||||
separater = ";"
|
||||
}
|
||||
for _, lib := range metadata.Libraries {
|
||||
arg += filepath.Join(libDir, lib.Downloads.Artifact.Path) + separater
|
||||
for _, lib := range instance.Libraries {
|
||||
arg += filepath.Join(libDir, lib) + separater
|
||||
}
|
||||
arg += filepath.Join(binDir, mcVersion, "client.jar")
|
||||
args = append(args, arg)
|
||||
|
||||
|
||||
|
||||
args = append(args, metadata.MainClass)
|
||||
args = append(args, instance.MainClass)
|
||||
|
||||
for _, val := range searchArgs {
|
||||
switch val {
|
||||
@ -584,8 +584,8 @@ func GetBaseLaunchArgs(mcVersion string, libDir string, binDir string, assetDir
|
||||
}
|
||||
|
||||
|
||||
func GetOfflineLaunchArgs(mcVersion string, libDir string, binDir string, assetDir string, gameDir string, playerName string) ([]string, error) {
|
||||
args, err := GetBaseLaunchArgs(mcVersion, libDir, binDir, assetDir, gameDir)
|
||||
func GetOfflineLaunchArgs(mcVersion string, instance Instance, libDir string, binDir string, assetDir string, gameDir string, playerName string) ([]string, error) {
|
||||
args, err := GetBaseLaunchArgs(mcVersion, instance, libDir, binDir, assetDir, gameDir)
|
||||
if err != nil {
|
||||
return []string{}, fmt.Errorf("GatOfflineLaunchArgs: %e\n", err)
|
||||
}
|
||||
@ -607,8 +607,8 @@ func GetOfflineLaunchArgs(mcVersion string, libDir string, binDir string, assetD
|
||||
return args, nil
|
||||
}
|
||||
|
||||
func GetOnlineLaunchArgs(mcVersion string, libDir string, binDir string, assetDir string, gameDir string, auth LauncherAuth) ([]string, error) {
|
||||
args, err := GetBaseLaunchArgs(mcVersion, libDir, binDir, assetDir, gameDir)
|
||||
func GetOnlineLaunchArgs(mcVersion string, instance Instance, libDir string, binDir string, assetDir string, gameDir string, auth LauncherAuth) ([]string, error) {
|
||||
args, err := GetBaseLaunchArgs(mcVersion, instance, libDir, binDir, assetDir, gameDir)
|
||||
if err != nil {
|
||||
return []string{}, fmt.Errorf("GatOfflineLaunchArgs: %e\n", err)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user