This commit is contained in:
Amazed 2019-02-08 17:55:09 +01:00
commit 3da514d0f4
7 changed files with 326 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
.vs/
bin/
obj/

6
App.config Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>

60
GiantsLauncher.csproj Normal file
View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{C78FA352-3E44-40FD-854D-93A83520E801}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>GiantsLauncher</RootNamespace>
<AssemblyName>GiantsLauncher</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>giants_citizen_kabuto.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="giants_citizen_kabuto.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

25
GiantsLauncher.sln Normal file
View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.329
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GiantsLauncher", "GiantsLauncher.csproj", "{C78FA352-3E44-40FD-854D-93A83520E801}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C78FA352-3E44-40FD-854D-93A83520E801}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C78FA352-3E44-40FD-854D-93A83520E801}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C78FA352-3E44-40FD-854D-93A83520E801}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C78FA352-3E44-40FD-854D-93A83520E801}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {2952AF63-3169-4FAC-90E3-8BC05E8E9568}
EndGlobalSection
EndGlobal

196
Program.cs Normal file
View File

@ -0,0 +1,196 @@
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.IO;
using System.Diagnostics;
using System.Xml;
using System.Windows.Forms;
namespace GiantsLauncher
{
class GiantsLauncher
{
[STAThread]
static void Main(string[] args)
{
List<string> SERVERS = ReadServers();
//string[] SERVERS = new string[] {"gckms.no-ip.org", "ahipstercat.fr"};
string GIANTS_PATH = Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\PlanetMoon\Giants", "DestDir", "").ToString();
GIANTS_PATH += "\\Giants.exe";
if (!File.Exists(GIANTS_PATH))
{
GIANTS_PATH = SetPath();
GIANTS_PATH += "\\Giants.exe";
}
if (File.Exists(GIANTS_PATH))
{
Console.WriteLine("Giants path: {0}", GIANTS_PATH);
// check version
int version = GetGameBuild(GIANTS_PATH);
if (version != 1497)
{
// gtfo
Console.WriteLine("Game version is not 1.497. Found: {0}", version);
return;
}
string server_ok = "";
foreach (string server in SERVERS)
{
Console.WriteLine("Testing {0}", server);
if (TestServer(server))
{
server_ok = server;
break;
}
}
if (server_ok != "")
{
Console.WriteLine("Writing master server: {0}", server_ok);
using (BinaryWriter writer = new BinaryWriter(File.Open(GIANTS_PATH, FileMode.Open, FileAccess.ReadWrite)))
{
int offset = 0x157954; // position of master server in binary
Byte[] data = System.Text.Encoding.ASCII.GetBytes(server_ok);
writer.Seek(offset, SeekOrigin.Begin); //move cursor to the position
writer.Write(data);//write it
}
}
Process.Start(GIANTS_PATH);
}
}
static List<string> ReadServers()
{
// Loading from a file, you can also load from a stream
try
{
XmlDocument xml = new XmlDocument();
xml.Load("giantslauncher.xml");
XmlNodeList elemList = xml.GetElementsByTagName("masterserver");
List<string> array = new List<string>();
for (int i = 0; i < elemList.Count; i++)
{
array.Add(elemList[i].InnerXml);
}
if (array == null || array.Count < 1)
{
WriteInitialConfig();
return ReadServers();
}
return array;
}
catch (System.IO.FileNotFoundException)
{
WriteInitialConfig();
return ReadServers();
}
}
static void WriteInitialConfig()
{
XmlDocument xmlDoc = new XmlDocument();
XmlNode rootNode = xmlDoc.CreateElement("masterservers");
xmlDoc.AppendChild(rootNode);
XmlNode msNode = xmlDoc.CreateElement("masterserver");
msNode.InnerText = "gckms.no-ip.org";
rootNode.AppendChild(msNode);
msNode = xmlDoc.CreateElement("masterserver");
msNode.InnerText = "gckms.hipstercat.fr";
rootNode.AppendChild(msNode);
msNode = xmlDoc.CreateElement("masterserver");
msNode.InnerText = "gckms.vankerkom.be";
rootNode.AppendChild(msNode);
msNode = xmlDoc.CreateElement("masterserver");
msNode.InnerText = "gckms2.hipstercat.fr";
rootNode.AppendChild(msNode);
xmlDoc.Save("giantslauncher.xml");
}
static bool TestServer(string ip)
{
try
{
// Create a TcpClient.
// Note, for this client to work you need to have a TcpServer
// connected to the same address as specified by the server, port
// combination.
TcpClient client = new TcpClient();
var result = client.BeginConnect(ip, 28900, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2));
if (!success)
{
client.Close();
return false;
}
NetworkStream stream = client.GetStream();
// Buffer to store the response bytes.
Byte[] data = new Byte[256];
// String to store the response ASCII representation.
String responseData = String.Empty;
// Read the first batch of the TcpServer response bytes.
Int32 bytes = stream.Read(data, 0, data.Length);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
Console.WriteLine("Received: {0}", responseData);
// Close everything.
stream.Close();
//client.EndConnect(result);
return true;
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
return false;
}
}
static int GetGameBuild(string path)
{
using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open)))
{
int offset = 0x10da27; // position of game version as of 1497
reader.BaseStream.Seek(offset, SeekOrigin.Begin); // move cursor to the position
byte[] version = reader.ReadBytes(2); // read it
return BitConverter.ToUInt16(version, 0);
}
}
static string SetPath()
{
string path = "";
while (!File.Exists(path + "\\Giants.exe"))
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.Description = "Select your Giants game directory";
DialogResult dr = fbd.ShowDialog();
if (dr == DialogResult.OK)
{
path = fbd.SelectedPath;
}
else
{
Environment.Exit(1);
return "";
}
}
// add to registry
Microsoft.Win32.Registry.SetValue(@"HKEY_CURRENT_USER\Software\PlanetMoon\Giants", "DestDir", path);
return path;
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Les informations générales relatives à un assembly dépendent de
// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations
// associées à un assembly.
[assembly: AssemblyTitle("GiantsLauncher")]
[assembly: AssemblyDescription("Launch Giants")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("GiantsWD")]
[assembly: AssemblyProduct("GiantsLauncher")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly
// aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de
// COM, affectez la valeur true à l'attribut ComVisible sur ce type.
[assembly: ComVisible(false)]
// Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM
[assembly: Guid("c78fa352-3e44-40fd-854d-93a83520e801")]
// Les informations de version pour un assembly se composent des quatre valeurs suivantes :
//
// Version principale
// Version secondaire
// Numéro de build
// Révision
//
// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut
// en utilisant '*', comme indiqué ci-dessous :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

BIN
giants_citizen_kabuto.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB