Esempio n. 1
0
        private void InstallLibraries(IStatusListener listener)
        {
            listener.Log ("Installing libraries...");
            listener.SetProgress(0);

            var libraries = VersionParameters.Libraries.Where (x => x.AppliesHere).Where (x => x.RequiredForClient).ToList ();

            // Install missing libraries

            int progress = 0;
            int totalCount = libraries.Count ();

            foreach (var lib in libraries) {
                var libUrl = lib.Url;
                var libJar = lib.GetPath(this);
                var libDir = Path.GetDirectoryName(libJar);
                Directory.CreateDirectory(libDir);

                // Download the library if it does not already exist in the libraries directory
                if (!File.Exists (libJar))
                    Downloader.Single(libUrl, libJar, listener);

                // Ugh, apply the extract rules. I hope I do this right.
                // If Extract is present, that means we extract it. Otherwise, the jar just sits there... right??

                if (lib.Extract != null) {
                    ZipUtility.Extract(libJar, Path.Combine (GameLocation, "bin", "natives"), "-META-INF");
                } else {
                    Directory.CreateDirectory(Path.Combine (GameLocation, "bin"));
                    File.Copy (libJar, Path.Combine (GameLocation, "bin", lib.JarName));
                }

                ++progress;

                listener.SetStatus(string.Format ("Installed {0} / {1} libraries", progress, totalCount));
                listener.SetProgress((double)progress / totalCount);
            }

            listener.SetProgress(1);
        }
Esempio n. 2
0
        private void InstallAssets(IStatusListener listener)
        {
            listener.SetTitle("Installing Minecraft assets...");
            listener.SetProgress(0);

            listener.Log ("Installing assets...");

            var manifest = AssetManifest;

            listener.Log ("Found {0} assets in manifest...", manifest.Objects.Count);

            //var toInstall = manifest.Objects.Where (x => !x.IsInstalled(AssetsLocation));
            var toInstall = manifest.Objects;
            listener.Log ("Need to get {0} assets from Minecraft.net...", toInstall.Count ());

            int progress = 0;
            int total = toInstall.Sum (x => x.Size);
            int count = 0;
            int totalCount = toInstall.ToList().Count;

            foreach (var obj in toInstall) {
                obj.Install (manifest, AssetsLocation, listener);
                progress += obj.Size;
                count += 1;

                listener.SetProgress((double)progress / (double)total);
                listener.SetStatus(
                    string.Format (
                        "Installed {0} / {1} assets. Downloaded {2} / {3} MB",
                        count, totalCount,
                        Math.Round(progress / 1024.0 / 1024.0 * 100.0) / 100.0,
                        Math.Round (total / 1024.0 / 1024.0 * 100.0) / 100.0));
                Thread.Sleep(5);
            }

            listener.Log("Successfully installed all assets!");

            listener.SetProgress(1);
        }
Esempio n. 3
0
        public void Sync(IStatusListener listener)
        {
            listener.SetTitle("Synchronizing with server");
            listener.SetStatus("Please wait...");
            listener.SetProgress(0);
            listener.Log("Retrieving server-side instance description...");

            InstanceDescription fromServer = null;
            try {
                fromServer = FetchServerInstanceDescription();
            } catch (FailedDownloadException e) {
                listener.Log ("An error occurred fetching server-side instance description: {0}", e.Message);
                listener.Log ("Exception: {0}", e);
                return;
            }

            if (fromServer == null) {
                listener.Log ("Sync failed: Could not retrieve server-side instance description");
                return;
            }

            if (Description.StartRam == null)
                Description.StartRam = fromServer.StartRam;

            if (Description.MaxRam == null)
                Description.StartRam = fromServer.MaxRam;

            listener.SetStatus("Received server-side instance description...");
            listener.Log("Successfully retrieved server-side instance description");
            listener.Log("Checking for changes to instance configuration...");

            var oldDescription = Description;
            Description = fromServer;

            // Query for mods which have been removed

            listener.Log ("Checking for removed mods...");
            listener.SetStatus("Checking for removed mods...");
            var removedMods = oldDescription.Mods
                    .Where (x => !Description.Mods.Any (newMod => newMod.ArtifactId == x.ArtifactId));

            // Query for mods which have been added

            listener.Log ("Checking for newly installed mods...");
            listener.SetStatus("Checking for newly installed mods...");

            var addedMods = Description.Mods.Where (x => !oldDescription.Mods.Any (oldMod => oldMod.ArtifactId == x.ArtifactId));

            int count = 0;
            int total = removedMods.Count () + addedMods.Count ();

            foreach (var removedMod in removedMods) {
                listener.SetStatus(string.Format ("Removing {0} version {1}", removedMod.Name, removedMod.Version));
                listener.Log ("Server removed mod {0}: removing...", removedMod.ArtifactId);
                new Mod (removedMod).Remove (this.GameFolder);

                listener.SetProgress((double)count / (double)total);
                ++count;
            }

            foreach (var addedMod in addedMods) {
                listener.SetStatus(string.Format ("Installing {0} version {1}", addedMod.Name, addedMod.Version));
                listener.Log ("Server added mod {0}: installing...", addedMod.ArtifactId);
                new Mod (addedMod).Install (this.ModsStoreFolder, this.GameFolder, listener);

                listener.SetProgress((double)count / (double)total);
                ++count;
            }

            // Download new configuration files...

            listener.Log ("Checking configuration version..");
            listener.Log ("Local: {0}       Remote: {1}", oldDescription.ConfigVersion, Description.ConfigVersion);

            if (oldDescription.ConfigVersion < Description.ConfigVersion) {
                listener.Log (" * Need to update configuration from server...");
                UpdateConfigFiles (listener); // A change is needed...
            } else {
                listener.Log(" - Up to date");
            }

            listener.SetStatus("Writing updated instance description...");
            using (var sw = new StreamWriter(Path.Combine (GameFolder, "craftalyst-instance.json")))
                sw.Write(Description.ToJson());

            SaveDescription();

            listener.SetProgress(1);
        }
Esempio n. 4
0
        void UpdateConfigFiles(IStatusListener listener)
        {
            listener.SetTitle("Syncing client configuration from server...");
            listener.Log("Updating configuration files from the server...");
            listener.SetStatus("Please wait...");
            listener.SetProgress(0);

            List<string> configFiles = new List<string>();

            foreach (var list in Description.Mods.Select (x => x.ConfigFiles).Where (x => x != null))
                configFiles.AddRange(list);

            configFiles.AddRange(Description.SyncConfigs);

            int total = configFiles.Count();
            int count = 0;

            foreach (string configFile in configFiles) {
                string localFile = Path.Combine(GameFolder, "config", configFile);
                if (File.Exists(localFile))
                    File.Delete(localFile);

                listener.SetStatus(string.Format ("Pulling {0}", configFile));
                Downloader.Single(string.Format("{0}/config/{1}", Description.SyncUrl, configFile), localFile);

                listener.SetProgress((double)count / (double)total);
                ++count;
            }
            listener.SetProgress(1);
        }
Esempio n. 5
0
        public void Install(IStatusListener listener)
        {
            Directory.CreateDirectory(GameFolder);
            Directory.CreateDirectory(AssetsFolder);
            Directory.CreateDirectory(VersionsFolder);
            Directory.CreateDirectory(LibraryFolder);

            listener.Log("");
            listener.Log("");
            listener.Log("Installing Minecraft...");

            var mc = CreateMinecraft();
            mc.Install(listener);

            // Install mods...

            listener.Log("");
            listener.Log("");
            listener.Log("Installing mods...");
            listener.SetTitle("Installing mods...");

            int count = 0;
            int total = Description.Mods.Count ();

            foreach (var addedMod in Description.Mods) {
                listener.Log("Installing mod {0}", addedMod.ArtifactId);
                listener.SetStatus(string.Format ("Installing mod {0} {1}...", addedMod.Name, addedMod.Version));
                new Mod(addedMod).Install(this.ModsStoreFolder, this.GameFolder, listener);
                listener.SetProgress((double)count / (double)total);
            }

            listener.Log("Saving instance description...");
            listener.SetTitle("Saving instance...");
            listener.SetStatus("Just a bit longer!");

            SaveDescription();

            // Install configuration files...
            UpdateConfigFiles(listener);

            listener.Log("Performing synchronization with server...");
            // Update to latest from server
            Sync (listener);

            listener.SetTitle("All is done!");
            listener.SetProgress(1);
        }