Answer the question
In order to leave comments, you need to log in
Launcher in c#, errors when installing/updating etc. How to decide?
The zip file is located on the google drive, when you click the update button in the launcher, the file was downloaded and unzipped, and the update button (in the launcher) was replaced with play. version control, if the version does not match, then the file was deleted and downloaded again from google disk (there the file can be replaced). Version control will take place via a .txt file.
This is implemented in the code below, the code is taken from github
What is the problem?
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Windows;
namespace GameLauncher
{
enum LauncherStatus
{
ready,
failed,
downloadingGame,
downloadingUpdate
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private string rootPath;
private string versionFile;
private string gameZip;
private string gameExe;
private LauncherStatus _status;
internal LauncherStatus Status
{
get => _status;
set
{
_status = value;
switch (_status)
{
case LauncherStatus.ready:
PlayButton.Content = "Play";
break;
case LauncherStatus.failed:
PlayButton.Content = "Update Failed - Retry";
break;
case LauncherStatus.downloadingGame:
PlayButton.Content = "Downloading Game";
break;
case LauncherStatus.downloadingUpdate:
PlayButton.Content = "Downloading Update";
break;
default:
break;
}
}
}
public MainWindow()
{
InitializeComponent();
rootPath = Directory.GetCurrentDirectory();
versionFile = Path.Combine(rootPath, "Version.txt");
gameZip = Path.Combine(rootPath, "Build.zip");
gameExe = Path.Combine(rootPath, "Build", "Pirate Game.exe");
}
private void CheckForUpdates()
{
if (File.Exists(versionFile))
{
Version localVersion = new Version(File.ReadAllText(versionFile));
VersionText.Text = localVersion.ToString();
try
{
WebClient webClient = new WebClient();
Version onlineVersion = new Version(webClient.DownloadString("https://drive.google.com/file/d/1d4Rr2dentAzHSN9rrO5WP47SwRCqy664/view?usp=sharing"));
if (onlineVersion.IsDifferentThan(localVersion))
{
InstallGameFiles(true, onlineVersion);
}
else
{
Status = LauncherStatus.ready;
}
}
catch (Exception ex)
{
Status = LauncherStatus.failed;
MessageBox.Show($"Error checking for game updates: {ex}");
}
}
else
{
InstallGameFiles(false, Version.zero);
}
}
private void InstallGameFiles(bool _isUpdate, Version _onlineVersion)
{
try
{
WebClient webClient = new WebClient();
if (_isUpdate)
{
Status = LauncherStatus.downloadingUpdate;
}
else
{
Status = LauncherStatus.downloadingGame;
_onlineVersion = new Version(webClient.DownloadString("https://drive.google.com/file/d/1d4Rr2dentAzHSN9rrO5WP47SwRCqy664/view?usp=sharing"));
}
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadGameCompletedCallback);
webClient.DownloadFileAsync(new Uri("https://drive.google.com/u/0/uc?export=download&confirm=oPsx&id=1AjzpMqJq-CsDXDgfln2G9_2vE_8LgfJX"), gameZip, _onlineVersion);
}
catch (Exception ex)
{
Status = LauncherStatus.failed;
MessageBox.Show($"Error installing game files: {ex}");
}
}
private void DownloadGameCompletedCallback(object sender, AsyncCompletedEventArgs e)
{
try
{
string onlineVersion = ((Version)e.UserState).ToString();
ZipFile.ExtractToDirectory(gameZip, rootPath, true);
File.Delete(gameZip);
File.WriteAllText(versionFile, onlineVersion);
VersionText.Text = onlineVersion;
Status = LauncherStatus.ready;
}
catch (Exception ex)
{
Status = LauncherStatus.failed;
MessageBox.Show($"Error finishing download: {ex}");
}
}
private void Window_ContentRendered(object sender, EventArgs e)
{
CheckForUpdates();
}
private void PlayButton_Click(object sender, RoutedEventArgs e)
{
if (File.Exists(gameExe) && Status == LauncherStatus.ready)
{
ProcessStartInfo startInfo = new ProcessStartInfo(gameExe);
startInfo.WorkingDirectory = Path.Combine(rootPath, "Build");
Process.Start(startInfo);
Close();
}
else if (Status == LauncherStatus.failed)
{
CheckForUpdates();
}
}
}
struct Version
{
internal static Version zero = new Version(0, 0, 0);
private short major;
private short minor;
private short subMinor;
internal Version(short _major, short _minor, short _subMinor)
{
major = _major;
minor = _minor;
subMinor = _subMinor;
}
internal Version(string _version)
{
string[] versionStrings = _version.Split('.');
if (versionStrings.Length != 3)
{
major = 0;
minor = 0;
subMinor = 0;
return;
}
major = short.Parse(versionStrings[0]);
minor = short.Parse(versionStrings[1]);
subMinor = short.Parse(versionStrings[2]);
}
internal bool IsDifferentThan(Version _otherVersion)
{
if (major != _otherVersion.major)
{
return true;
}
else
{
if (minor != _otherVersion.minor)
{
return true;
}
else
{
if (subMinor != _otherVersion.subMinor)
{
return true;
}
}
}
return false;
}
public override string ToString()
{
return $"{major}.{minor}.{subMinor}";
}
}
}
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question