Significantly refactor launcher. Public servers list and 'minecraft.net/classicube.net server' tabs are merged into one tab. As both the minecraft.net and classicube.net tabs essentially shared the exact same functionality, this functionality is encapsulated in a new 'GameState' class.

This commit is contained in:
UnknownShadow200 2015-07-01 09:12:12 +10:00
parent 536845393c
commit f88405330c
6 changed files with 963 additions and 1184 deletions

View File

@ -36,7 +36,9 @@
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
<NoWin32Manifest>False</NoWin32Manifest>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -52,6 +54,7 @@
<Optimize>False</Optimize>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>..\output\release\</OutputPath>
@ -77,6 +80,7 @@
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="MainForm.GameState.cs" />
<Compile Include="MinecraftSession.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,184 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Net;
using System.Threading;
using System.Windows.Forms;
namespace Launcher {
public delegate void Action<T1, T2>( T1 arg1, T2 arg2 );
internal class GameState {
public ProgressBar Progress;
public Label Status;
public TextBox Username, Password;
public List<ServerListEntry> Servers;
public string HostServer;
public GameSession Session;
public Button SignInButton;
public TabControl Tab;
public TabPage ServersTab;
public ListView ServersTable;
public TextBox Hash;
public Predicate<ServerListEntry> Filter;
public MainForm form;
public void DoSignIn() {
if( String.IsNullOrEmpty( Username.Text ) ) {
MessageBox.Show( "Please enter a username." );
return;
}
if( String.IsNullOrEmpty( Password.Text ) ) {
MessageBox.Show( "Please enter a password." );
return;
}
if( Session.Username != null ) {
Session.ResetSession();
ServersTable.Items.Clear();
Servers.Clear();
}
SignInButton.Enabled = false;
Tab.TabPages.Remove( ServersTab );
Thread loginThread = new Thread( LoginAsync );
loginThread.Name = "Launcher.LoginAsync_" + HostServer;
loginThread.IsBackground = true;
loginThread.Start();
}
void LoginAsync() {
SetStatus( 0, "Signing in.." );
try {
Session.Login( Username.Text, Password.Text );
} catch( WebException ex ) {
Session.Username = null;
LoginEnd( false );
DisplayWebException( ex, "sign in", SetStatus );
return;
} catch( InvalidOperationException ex ) {
Session.Username = null;
LoginEnd( false );
string text = "Failed to sign in: " + Environment.NewLine + ex.Message;
SetStatus( 0, text );
return;
}
SetStatus( 50, "Retrieving public servers list.." );
try {
Servers = Session.GetPublicServers();
} catch( WebException ex ) {
Servers = new List<ServerListEntry>();
LoginEnd( false );
DisplayWebException( ex, "retrieve servers list", SetStatus );
return;
}
SetStatus( 100, "Done" );
LoginEnd( true );
}
public void LoginEnd( bool success ) {
if( form.InvokeRequired ) {
form.Invoke( (Action<bool>)LoginEnd, success );
} else {
GC.Collect();
if( success ) {
Tab.TabPages.Add( ServersTab );
FilterList();
}
SignInButton.Enabled = true;
}
}
void SetStatus( int percentage, string text ) {
if( form.InvokeRequired ) {
form.Invoke( (Action<int, string>)SetStatus, percentage, text );
} else {
Progress.Value = percentage;
Status.Text = text;
}
}
public void ConnectToServer() {
GameStartData data = null;
try {
data = Session.GetConnectInfo( Hash.Text );
} catch( WebException ex ) {
DisplayWebException( ex, "retrieve server info",
(p, text) => MessageBox.Show( text ) );
return;
}
MainForm.StartClient( data, true );
}
public void FilterList() {
ServersTable.Items.Clear();
if( Servers.Count == 0 ) return;
IComparer sorter = ServersTable.ListViewItemSorter;
ServersTable.ListViewItemSorter = null;
for( int i = 0; i < Servers.Count; i++ ) {
ServerListEntry entry = Servers[i];
if( Filter( entry ) ) {
string[] row = { entry.Name, entry.Players, entry.MaximumPlayers, entry.Uptime, entry.Hash };
ServersTable.Items.Add( new ListViewItem( row ) );
}
}
if( sorter != null ) {
ServersTable.ListViewItemSorter = sorter;
ServersTable.Sort();
}
ServersTable.EndUpdate();
}
public void HashChanged() {
string hash = Hash.Text;
ListView.SelectedIndexCollection selected = ServersTable.SelectedIndices;
if( selected.Count > 0 ) {
ServersTable.Items[selected[0]].Selected = false;
}
int count = ServersTable.Items.Count;
for( int i = 0; i < count; i++ ) {
ListViewItem entry = ServersTable.Items[i];
if( hash == entry.SubItems[4].Text ) {
entry.Selected = true;
ServersTable.EnsureVisible( i );
break;
}
}
}
public void ServerTableClick() {
Point mousePos = ServersTable.PointToClient( MainForm.MousePosition );
ListViewHitTestInfo hitTest = ServersTable.HitTest( mousePos );
if( hitTest != null && hitTest.Item != null ) {
Hash.Text = hitTest.Item.SubItems[4].Text;
}
}
void DisplayWebException( WebException ex, string action, Action<int, string> target ) {
string host = HostServer;
if( ex.Status == WebExceptionStatus.Timeout ) {
string text = "Failed to " + action + ":" +
Environment.NewLine + "Timed out while connecting to " + host + ", it may be down.";
target( 0, text );
} else if( ex.Status == WebExceptionStatus.ProtocolError ) {
HttpWebResponse response = (HttpWebResponse)ex.Response;
int errorCode = (int)response.StatusCode;
string description = response.StatusDescription;
string text = "Failed to " + action + ":" +
Environment.NewLine + host + " returned: (" + errorCode + ") " + description;
target( 0, text );
} else if( ex.Status == WebExceptionStatus.NameResolutionFailure ) {
string text = "Failed to " + action + ":" +
Environment.NewLine + "Unable to resolve " + host + ", you may not be connected to the internet.";
target( 0, text );
} else {
string text = "Failed to " + action + ":" + Environment.NewLine + ex.Status;
target( 0, text );
}
}
}
}

View File

@ -1,13 +1,10 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
namespace Launcher {
@ -19,15 +16,32 @@ namespace Launcher {
InitializeComponent();
AdjustTabs();
SetTooltips();
tblMCServers.HandleCreated += tblMCServersHandleCreated;
tblCCServers.HandleCreated += tblCCServersHandleCreated;
// hide tabs at start
tabMC.TabPages.Remove( tabMCServers );
tabMC.TabPages.Remove( tabMCServer );
tabCC.TabPages.Remove( tabCCServers );
tabCC.TabPages.Remove( tabCCServer );
Shown += DisplayResourcesDialog;
mc = new GameState() { Progress = prgMCStatus, Status = lblMCStatus,
Username = txtMCUser, Password = txtMCPassword, HostServer = "minecraft.net",
Session = new MinecraftSession(), SignInButton = btnMCSignIn, Tab = tabMC,
ServersTab = tabMCServers, ServersTable = tblMCServers, Hash = txtMCHash,
form = this };
cc = new GameState() { Progress = prgCCStatus, Status = lblCCStatus,
Username = txtCCUser, Password = txtCCPassword, HostServer = "classicube.net",
Session = new ClassicubeSession(), SignInButton = btnCCSignIn, Tab = tabCC,
ServersTab = tabCCServers, ServersTable = tblCCServers, Hash = txtCCHash,
form = this };
mc.Filter = e =>
// NOTE: using ToLower().Contains() allocates too many unecessary strings.
e.Name.IndexOf( txtMCSearch.Text, StringComparison.OrdinalIgnoreCase ) >= 0
&& ( cbMCHideEmpty.Checked ? e.Players[0] != '0' : true )
&& ( cbMCHideInvalid.Checked ? Int32.Parse( e.Players ) < 600 : true );
cc.Filter = e =>
e.Name.IndexOf( txtCCSearch.Text, StringComparison.OrdinalIgnoreCase ) >= 0
&& ( cbCCHideEmpty.Checked ? e.Players[0] != '0' : true );
}
GameState mc, cc;
void DisplayResourcesDialog( object sender, EventArgs e ) {
// TODO: async fetching
@ -36,14 +50,12 @@ namespace Launcher {
DialogResult result = MessageBox.Show(
"Some required resources weren't found. Would you like to download them now?", "Missing resources",
MessageBoxButtons.OKCancel );
if( result == DialogResult.OK ) {
if( result == DialogResult.OK ) {
fetcher.Run( this );
Text = AppName;
}
}
}
}
delegate void Action<T1, T2>( T1 arg1, T2 arg2 );
void SetTooltips() {
toolTip.SetToolTip( lblLanUser, "The username to use when connecting to the local server. " + Environment.NewLine +
@ -64,82 +76,21 @@ namespace Launcher {
void AdjustTabs() {
tabs.Width = ClientSize.Width + 6;
tabs.Height = ClientSize.Height + 3;
tabMC.Width = tabCC.Width = tabs.SelectedTab.Size.Width + 10;
tabMC.Width = tabCC.Width = tabs.Width;
tabMC.Height = tabCC.Height = tabs.SelectedTab.Size.Height + 10;
if( tblMCServers.IsHandleCreated ) {
AdjustTablePos( tblMCServers );
AdjustTablePos( tblMCServers, btnMCConnect );
}
if( tblCCServers.IsHandleCreated ) {
AdjustTablePos( tblCCServers );
AdjustTablePos( tblCCServers, btnCCConnect );
}
}
void tblMCServersHandleCreated( object sender, EventArgs e ) {
AdjustTablePos( tblMCServers );
}
void tblCCServersHandleCreated( object sender, EventArgs e ) {
AdjustTablePos( tblCCServers );
}
void AdjustTablePos( Control control ) {
void AdjustTablePos( Control control, Control connectButton ) {
Point formLoc = PointToClient( control.Parent.PointToScreen( control.Location ) );
control.Width = ClientSize.Width - formLoc.X;
control.Height = ClientSize.Height - formLoc.Y;
}
static string missingExeMessage = "Failed to start ClassicalSharp. (classicalsharp.exe was not found)"
+ Environment.NewLine + Environment.NewLine +
"This application is only the launcher, it is not the actual client. " +
"Please place the launcher in the same directory as the client (classicalsharp.exe).";
static void StartClient( GameStartData data, bool classicubeSkins ) {
string skinServer = classicubeSkins ? "http://www.classicube.net/static/skins/" : "http://s3.amazonaws.com/MinecraftSkins/";
string args = data.Username + " " + data.Mppass + " " +
data.Ip + " " + data.Port + " " + skinServer;
Log( "starting..." + args );
Process process = null;
try {
process = Process.Start( "classicalsharp.exe", args );
} catch( Win32Exception ex ) {
if( ex.Message.Contains( "The system cannot find the file specified" ) ) {
MessageBox.Show( missingExeMessage );
} else {
throw;
}
} finally {
if( process != null ) {
process.Dispose();
}
}
}
static void Log( string text ) {
System.Diagnostics.Debug.WriteLine( text );
}
static void DisplayWebException( WebException ex, string action, string host, Action<int, string> target ) {
if( ex.Status == WebExceptionStatus.Timeout ) {
string text = "Failed to " + action + ":" +
Environment.NewLine + "Timed out while connecting to " + host + ", it may be down.";
target( 0, text );
} else if( ex.Status == WebExceptionStatus.ProtocolError ) {
HttpWebResponse response = (HttpWebResponse)ex.Response;
int errorCode = (int)response.StatusCode;
string description = response.StatusDescription;
string text = "Failed to " + action + ":" +
Environment.NewLine + host + " returned: (" + errorCode + ") " + description;
target( 0, text );
} else if( ex.Status == WebExceptionStatus.NameResolutionFailure ) {
string text = "Failed to " + action + ":" +
Environment.NewLine + "Unable to resolve " + host + ", you may not be connected to the internet.";
target( 0, text );
} else {
string text = "Failed to " + action + ":" +
Environment.NewLine + ex.Status;
target( 0, text );
}
control.Height = ClientSize.Height - formLoc.Y - connectButton.Height - 5;
}
#region Local tab
@ -186,12 +137,6 @@ namespace Launcher {
#endregion
#region minecraft.net tab
MinecraftSession mcSession = new MinecraftSession();
List<ServerListEntry> mcServers = new List<ServerListEntry>();
NameComparer mcNameComparer = new NameComparer( 0 );
NumericalComparer mcPlayersComparer = new NumericalComparer( 1 );
NumericalComparer mcMaxPlayersComparer = new NumericalComparer( 2 );
@ -213,165 +158,21 @@ namespace Launcher {
tblMCServers.Sort();
}
void McFilterList() {
tblMCServers.Items.Clear();
if( mcServers.Count == 0 ) return;
IComparer sorter = tblMCServers.ListViewItemSorter;
tblMCServers.ListViewItemSorter = null;
tblMCServers.BeginUpdate();
Predicate<ServerListEntry> filter = e =>
// NOTE: using ToLower().Contains() allocates too many unecessary strings.
e.Name.IndexOf( txtMCSearch.Text, StringComparison.OrdinalIgnoreCase ) >= 0
&& ( cbMCHideEmpty.Checked ? e.Players[0] != '0' : true )
&& ( cbMCHideInvalid.Checked ? Int32.Parse( e.Players ) < 600 : true );
for( int i = 0; i < mcServers.Count; i++ ) {
ServerListEntry entry = mcServers[i];
if( filter( entry ) ) {
string[] row = { entry.Name, entry.Players, entry.MaximumPlayers, entry.Uptime, entry.Hash };
tblMCServers.Items.Add( new ListViewItem( row ) );
}
}
if( sorter != null ) {
tblMCServers.ListViewItemSorter = sorter;
tblMCServers.Sort();
}
tblMCServers.EndUpdate();
}
void txtMCSearchTextChanged( object sender, EventArgs e ) { mc.FilterList(); }
void txtMCSearchTextChanged( object sender, EventArgs e ) {
McFilterList();
}
void cbMCHideEmptyCheckedChanged( object sender, EventArgs e ) { mc.FilterList(); }
void cbMCHideEmptyCheckedChanged( object sender, EventArgs e ) {
McFilterList();
}
void cbMCHideInvalidCheckedChanged(object sender, EventArgs e ) { mc.FilterList(); }
void cbMCHideInvalidCheckedChanged(object sender, EventArgs e ) {
McFilterList();
}
void tblMCServersClick( object sender, EventArgs e ) { mc.ServerTableClick(); }
void tblMCServersDoubleClick( object sender, EventArgs e ) {
Point mousePos = tblMCServers.PointToClient( MousePosition );
ListViewHitTestInfo hitTest = tblMCServers.HitTest( mousePos );
if( hitTest != null && hitTest.Item != null ) {
txtMCHash.Text = hitTest.Item.SubItems[4].Text;
tabMC.SelectedIndex = 2;
}
}
void txtMCHashTextChanged( object sender, EventArgs e ) { mc.HashChanged(); }
void txtMCHashTextChanged( object sender, EventArgs e ) {
string hash = txtMCHash.Text;
lblMCPublicName.Text = "No public name";
for( int i = 0; i < mcServers.Count; i++ ) {
ServerListEntry entry = mcServers[i];
if( hash == entry.Hash ) {
lblMCPublicName.Text = entry.Name;
break;
}
}
}
void btnMCConnectClick( object sender, EventArgs e ) { mc.ConnectToServer(); }
void btnMCConnectClick( object sender, EventArgs e ) {
GameStartData data = null;
try {
data = mcSession.GetConnectInfo( txtMCHash.Text );
} catch( WebException ex ) {
DisplayWebException( ex, "retrieve server info", "minecraft.net",
(p, text) => MessageBox.Show( text ) );
return;
}
StartClient( data, false );
}
void btnMCSignInClick( object sender, EventArgs e ) { mc.DoSignIn(); }
void btnMCSignInClick( object sender, EventArgs e ) {
if( String.IsNullOrEmpty( txtMCUser.Text ) ) {
MessageBox.Show( "Please enter a username." );
return;
}
if( String.IsNullOrEmpty( txtMCPassword.Text ) ) {
MessageBox.Show( "Please enter a password." );
return;
}
if( mcSession.Username != null ) {
mcSession.ResetSession();
tblMCServers.Items.Clear();
mcServers.Clear();
}
btnMCSignIn.Enabled = false;
tabMC.TabPages.Remove( tabMCServers );
tabMC.TabPages.Remove( tabMCServer );
mcLoginThread = new Thread( McLoginAsync );
mcLoginThread.Name = "Launcher.McLoginAsync";
mcLoginThread.IsBackground = true;
mcLoginThread.Start();
}
Thread mcLoginThread;
void McLoginAsync() {
SetMcStatus( 0, "Signing in.." );
try {
mcSession.Login( txtMCUser.Text, txtMCPassword.Text );
} catch( WebException ex ) {
mcSession.Username = null;
McLoginEnd( false );
DisplayWebException( ex, "sign in", "minecraft.net", SetMcStatus );
return;
} catch( InvalidOperationException ex ) {
SetMcStatus( 0, "Failed to sign in" );
mcSession.Username = null;
McLoginEnd( false );
string text = "Failed to sign in: " + Environment.NewLine + ex.Message;
SetMcStatus( 0, text );
return;
}
SetMcStatus( 50, "Retrieving public servers list.." );
try {
mcServers = mcSession.GetPublicServers();
} catch( WebException ex ) {
mcServers = new List<ServerListEntry>();
McLoginEnd( false );
DisplayWebException( ex, "retrieve servers list", "minecraft.net", SetMcStatus );
return;
}
SetMcStatus( 100, "Done" );
McLoginEnd( true );
}
void McLoginEnd( bool success ) {
if( InvokeRequired ) {
Invoke( (Action<bool>)McLoginEnd, success );
} else {
GC.Collect();
if( success ) {
tabMC.TabPages.Add( tabMCServers );
tabMC.TabPages.Add( tabMCServer );
McFilterList();
}
btnMCSignIn.Enabled = true;
}
}
void SetMcStatus( int percentage, string text ) {
if( InvokeRequired ) {
Invoke( (Action<int, string>)SetMcStatus, percentage, text );
} else {
prgMCStatus.Value = percentage;
lblMCStatus.Text = text;
}
}
#endregion
#region classicube.net tab
ClassicubeSession ccSession = new ClassicubeSession();
List<ServerListEntry> ccServers = new List<ServerListEntry>();
NameComparer ccNameComparer = new NameComparer( 0 );
NumericalComparer ccPlayersComparer = new NumericalComparer( 1 );
NumericalComparer ccMaxPlayersComparer = new NumericalComparer( 2 );
@ -391,151 +192,40 @@ namespace Launcher {
tblCCServers.Sort();
}
void CcFilterList() {
tblCCServers.Items.Clear();
if( ccServers.Count == 0 ) return;
IComparer sorter = tblCCServers.ListViewItemSorter;
tblCCServers.ListViewItemSorter = null;
tblCCServers.BeginUpdate();
Predicate<ServerListEntry> filter = e =>
e.Name.IndexOf( txtCCSearch.Text, StringComparison.OrdinalIgnoreCase ) >= 0
&& ( cbCCHideEmpty.Checked ? e.Players[0] != '0' : true );
for( int i = 0; i < ccServers.Count; i++ ) {
ServerListEntry entry = ccServers[i];
if( filter( entry ) ) {
string[] row = { entry.Name, entry.Players, entry.MaximumPlayers, entry.Uptime, entry.Hash };
tblCCServers.Items.Add( new ListViewItem( row ) );
}
}
if( sorter != null ) {
tblCCServers.ListViewItemSorter = sorter;
tblCCServers.Sort();
}
tblCCServers.EndUpdate();
}
void txtCCSearchTextChanged( object sender, EventArgs e ) { cc.FilterList(); }
void txtCCSearchTextChanged( object sender, EventArgs e ) {
CcFilterList();
}
void cbCCHideEmptyCheckedChanged( object sender, EventArgs e ) { cc.FilterList(); }
void cbCCHideEmptyCheckedChanged( object sender, EventArgs e ) {
CcFilterList();
}
void tblCCServersClick( object sender, EventArgs e ) { cc.ServerTableClick(); }
void tblCCServersDoubleClick( object sender, EventArgs e ) {
Point mousePos = tblCCServers.PointToClient( MousePosition );
ListViewHitTestInfo hitTest = tblCCServers.HitTest( mousePos );
if( hitTest != null && hitTest.Item != null ) {
txtCCHash.Text = hitTest.Item.SubItems[4].Text;
tabCC.SelectedIndex = 2;
}
}
void txtCCHashTextChanged( object sender, EventArgs e ) { cc.HashChanged(); }
void txtCCHashTextChanged( object sender, EventArgs e ) {
string hash = txtCCHash.Text;
lblCCPublicName.Text = "No public name";
for( int i = 0; i < ccServers.Count; i++ ) {
ServerListEntry entry = ccServers[i];
if( hash == entry.Hash ) {
lblCCPublicName.Text = entry.Name;
break;
}
}
}
void btnCCConnectClick( object sender, EventArgs e ) { cc.ConnectToServer(); }
void btnCCConnectClick( object sender, EventArgs e ) {
GameStartData data = null;
try {
data = ccSession.GetConnectInfo( txtCCHash.Text );
} catch( WebException ex ) {
DisplayWebException( ex, "retrieve server info", "classicube.net",
(p, text) => MessageBox.Show( text ) );
return;
}
StartClient( data, true );
}
void btnCCSignInClick( object sender, EventArgs e ) {
if( String.IsNullOrEmpty( txtCCUser.Text ) ) {
MessageBox.Show( "Please enter a username." );
return;
}
if( String.IsNullOrEmpty( txtCCPassword.Text ) ) {
MessageBox.Show( "Please enter a password." );
return;
}
if( ccSession.Username != null ) {
ccSession.ResetSession();
tblCCServers.Items.Clear();
ccServers.Clear();
}
btnCCSignIn.Enabled = false;
tabCC.TabPages.Remove( tabCCServers );
tabCC.TabPages.Remove( tabCCServer );
ccLoginThread = new Thread( CcLoginAsync );
ccLoginThread.Name = "Launcher.CcLoginAsync";
ccLoginThread.IsBackground = true;
ccLoginThread.Start();
}
Thread ccLoginThread;
void CcLoginAsync() {
SetCcStatus( 0, "Signing in.." );
try {
ccSession.Login( txtCCUser.Text, txtCCPassword.Text );
} catch( WebException ex ) {
ccSession.Username = null;
CcLoginEnd( false );
DisplayWebException( ex, "sign in", "classicube.net", SetCcStatus );
return;
} catch( InvalidOperationException ex ) {
SetCcStatus( 0, "Failed to sign in" );
ccSession.Username = null;
CcLoginEnd( false );
string text = "Failed to sign in: " + Environment.NewLine + ex.Message;
SetCcStatus( 0, text );
return;
}
SetCcStatus( 50, "Retrieving public servers list.." );
try {
ccServers = ccSession.GetPublicServers();
} catch( WebException ex ) {
ccServers = new List<ServerListEntry>();
CcLoginEnd( false );
DisplayWebException( ex, "retrieve servers list", "classicube.net", SetCcStatus );
return;
}
SetCcStatus( 100, "Done" );
CcLoginEnd( true );
}
void CcLoginEnd( bool success ) {
if( InvokeRequired ) {
Invoke( (Action<bool>)CcLoginEnd, success );
} else {
GC.Collect();
if( success ) {
tabCC.TabPages.Add( tabCCServers );
tabCC.TabPages.Add( tabCCServer );
CcFilterList();
}
btnCCSignIn.Enabled = true;
}
}
void SetCcStatus( int percentage, string text ) {
if( InvokeRequired ) {
Invoke( (Action<int, string>)SetCcStatus, percentage, text );
} else {
prgCCStatus.Value = percentage;
lblCCStatus.Text = text;
}
}
#endregion
void btnCCSignInClick( object sender, EventArgs e ) { cc.DoSignIn(); }
static string missingExeMessage = "Failed to start ClassicalSharp. (classicalsharp.exe was not found)"
+ Environment.NewLine + Environment.NewLine +
"This application is only the launcher, it is not the actual client. " +
"Please place the launcher in the same directory as the client (classicalsharp.exe).";
internal static void StartClient( GameStartData data, bool classicubeSkins ) {
string skinServer = classicubeSkins ? "http://www.classicube.net/static/skins/" : "http://s3.amazonaws.com/MinecraftSkins/";
string args = data.Username + " " + data.Mppass + " " +
data.Ip + " " + data.Port + " " + skinServer;
System.Diagnostics.Debug.WriteLine( "starting..." + args );
Process process = null;
try {
process = Process.Start( "classicalsharp.exe", args );
} catch( Win32Exception ex ) {
if( ex.Message.Contains( "The system cannot find the file specified" ) ) {
MessageBox.Show( missingExeMessage );
} else {
throw;
}
}
}
}
}

View File

@ -117,8 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing">
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</data>
</metadata>
</root>

View File

@ -1,6 +1,6 @@
* Note that the first time you run the launcher, a dialog box will pop up with the message
"Some required resources weren't found." Just click OK. (This is because I cannot redistribute
the assets of Mine craft Classic with the application as they are the copyrighted property of Mojang)
the assets of MineCraft Classic with the application as they are the copyrighted property of Mojang)
The launcher is divided into 3 tabs. They are:
1) Local tab
@ -11,18 +11,18 @@ custom skins if you are not connected to the internet, however)
Click "connect" to start the client.
2) Mine craft.net
### Note: Mojang appears to have deleted all of the unpaid free accounts. Premium accounts should still
### work though. The public servers list on minecraft.net is also completely stuffed. There are servers
### that appear on the list that are either fake, or don't actually exist anymore.
### You are probably better off just using ClassiCube.net.
2) MineCraft.net
# Note: Mojang appears to have deleted all of the unpaid free accounts. Premium accounts should still
# work though. The public servers list on minecraft.net is also completely stuffed, as most servers
# that appear on the list that are either fake or don't actually exist anymore.
# You are probably better off just using ClassiCube.net.
You will need to provide the username and password for your minecraft.net account. Then click sign in.
If sign-in was successful, two new tabs should appear beside 'Sign in'.
You can then either:
A) Browse the public servers list and double-click on a server (Which will then take you to the 'minecraft.net server' tab with the hash filled in for you)
B) Directly enter in a hash in the 'minecraft.net server' tab.
A) Browse the public servers list and click on a cell (Which will then fill in the hash textbox)
B) Directly enter in a hash into the hash textbox.
Then click "connect". The launcher will then download the necessary information about the server from minecraft.net and start the client.