- Added a "Block Protected Games" button, removing the old static anti-cheat directory detection
- Small aesthetic improvements to the selection form
- Transitioned from obsolete WebClient to HttpClient for SteamCMD downloading
This commit is contained in:
pointfeev 2022-01-17 15:47:56 -06:00
parent 11ff5e3407
commit 93713a0f6a
6 changed files with 182 additions and 51 deletions

View file

@ -6,7 +6,7 @@ using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Windows.Forms;
@ -59,9 +59,10 @@ namespace CreamInstaller
Kill();
if (!File.Exists(FilePath))
{
using (WebClient webClient = new())
using (HttpClient httpClient = new())
{
webClient.DownloadFile("https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip", ArchivePath);
byte[] file = httpClient.GetByteArrayAsync("https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip").Result;
file.Write(ArchivePath);
}
ZipFile.ExtractToDirectory(ArchivePath, DirectoryPath);

View file

@ -5,7 +5,7 @@
<UseWindowsForms>true</UseWindowsForms>
<ApplicationIcon>Resources\ini.ico</ApplicationIcon>
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
<Version>2.0.4.2</Version>
<Version>2.0.5.0</Version>
<PackageIcon>Resources\ini.ico</PackageIcon>
<PackageIconUrl />
<Description>Automatically generates and installs CreamAPI files for Steam games on the user's computer. It can also generate and install CreamAPI for the Paradox Launcher should the user select a Paradox Interactive game.</Description>

View file

@ -12,13 +12,21 @@ namespace CreamInstaller
Icon = Properties.Resources.Icon;
}
public DialogResult Show(string formName, Icon descriptionIcon, string descriptionText, string acceptButtonText, string cancelButtonText)
public DialogResult Show(string formName, Icon descriptionIcon, string descriptionText, string acceptButtonText, string cancelButtonText = null)
{
icon.Image = descriptionIcon.ToBitmap();
Text = formName;
descriptionLabel.Text = descriptionText;
acceptButton.Text = acceptButtonText;
cancelButton.Text = cancelButtonText;
if (cancelButtonText is null)
{
cancelButton.Enabled = false;
cancelButton.Visible = false;
}
else
{
cancelButton.Text = cancelButtonText;
}
return ShowDialog();
}
}

View file

@ -36,12 +36,18 @@ namespace CreamInstaller
this.label1 = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.noneFoundLabel = new System.Windows.Forms.Label();
this.treeView1 = new CreamInstaller.CustomTreeView();
this.selectionTreeView = new CreamInstaller.CustomTreeView();
this.blockProtectedHelpButton = new System.Windows.Forms.Button();
this.blockedGamesCheckBox = new System.Windows.Forms.CheckBox();
this.allCheckBox = new System.Windows.Forms.CheckBox();
this.progressBar1 = new System.Windows.Forms.ProgressBar();
this.label2 = new System.Windows.Forms.Label();
this.scanButton = new System.Windows.Forms.Button();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel();
this.groupBox1.SuspendLayout();
this.flowLayoutPanel1.SuspendLayout();
this.flowLayoutPanel2.SuspendLayout();
this.SuspendLayout();
//
// acceptButton
@ -80,8 +86,7 @@ namespace CreamInstaller
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox1.Controls.Add(this.noneFoundLabel);
this.groupBox1.Controls.Add(this.treeView1);
this.groupBox1.Controls.Add(this.allCheckBox);
this.groupBox1.Controls.Add(this.selectionTreeView);
this.groupBox1.Location = new System.Drawing.Point(12, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(560, 308);
@ -102,28 +107,58 @@ namespace CreamInstaller
this.noneFoundLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.noneFoundLabel.Visible = false;
//
// treeView1
// selectionTreeView
//
this.treeView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
this.selectionTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.treeView1.BackColor = System.Drawing.SystemColors.Control;
this.treeView1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.treeView1.CheckBoxes = true;
this.treeView1.Enabled = false;
this.treeView1.FullRowSelect = true;
this.treeView1.HotTracking = true;
this.treeView1.Location = new System.Drawing.Point(6, 22);
this.treeView1.Name = "treeView1";
this.treeView1.Size = new System.Drawing.Size(548, 280);
this.treeView1.TabIndex = 1001;
this.selectionTreeView.BackColor = System.Drawing.SystemColors.Control;
this.selectionTreeView.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.selectionTreeView.CheckBoxes = true;
this.selectionTreeView.Enabled = false;
this.selectionTreeView.FullRowSelect = true;
this.selectionTreeView.HotTracking = true;
this.selectionTreeView.Location = new System.Drawing.Point(6, 22);
this.selectionTreeView.Name = "selectionTreeView";
this.selectionTreeView.Size = new System.Drawing.Size(548, 280);
this.selectionTreeView.TabIndex = 1001;
//
// blockProtectedHelpButton
//
this.blockProtectedHelpButton.Enabled = false;
this.blockProtectedHelpButton.Font = new System.Drawing.Font("Segoe UI", 7F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.blockProtectedHelpButton.Location = new System.Drawing.Point(151, 3);
this.blockProtectedHelpButton.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
this.blockProtectedHelpButton.Name = "blockProtectedHelpButton";
this.blockProtectedHelpButton.Size = new System.Drawing.Size(19, 19);
this.blockProtectedHelpButton.TabIndex = 1004;
this.blockProtectedHelpButton.Text = "?";
this.blockProtectedHelpButton.UseVisualStyleBackColor = true;
this.blockProtectedHelpButton.Click += new System.EventHandler(this.OnBlockProtectedGamesHelpButtonClicked);
//
// blockedGamesCheckBox
//
this.blockedGamesCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.blockedGamesCheckBox.AutoSize = true;
this.blockedGamesCheckBox.Checked = true;
this.blockedGamesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.blockedGamesCheckBox.Enabled = false;
this.blockedGamesCheckBox.Location = new System.Drawing.Point(3, 3);
this.blockedGamesCheckBox.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3);
this.blockedGamesCheckBox.Name = "blockedGamesCheckBox";
this.blockedGamesCheckBox.Size = new System.Drawing.Size(148, 19);
this.blockedGamesCheckBox.TabIndex = 1003;
this.blockedGamesCheckBox.Text = "Block Protected Games";
this.blockedGamesCheckBox.UseVisualStyleBackColor = true;
this.blockedGamesCheckBox.CheckedChanged += new System.EventHandler(this.OnBlockProtectedGamesCheckBoxChanged);
//
// allCheckBox
//
this.allCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.allCheckBox.AutoSize = true;
this.allCheckBox.Enabled = false;
this.allCheckBox.Location = new System.Drawing.Point(514, 0);
this.allCheckBox.Location = new System.Drawing.Point(3, 3);
this.allCheckBox.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3);
this.allCheckBox.Name = "allCheckBox";
this.allCheckBox.Size = new System.Drawing.Size(40, 19);
this.allCheckBox.TabIndex = 1;
@ -162,12 +197,37 @@ namespace CreamInstaller
this.scanButton.UseVisualStyleBackColor = true;
this.scanButton.Click += new System.EventHandler(this.OnScan);
//
// flowLayoutPanel1
//
this.flowLayoutPanel1.Anchor = System.Windows.Forms.AnchorStyles.Top;
this.flowLayoutPanel1.AutoSize = true;
this.flowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.flowLayoutPanel1.Controls.Add(this.blockedGamesCheckBox);
this.flowLayoutPanel1.Controls.Add(this.blockProtectedHelpButton);
this.flowLayoutPanel1.Location = new System.Drawing.Point(230, 9);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(173, 25);
this.flowLayoutPanel1.TabIndex = 1005;
//
// flowLayoutPanel2
//
this.flowLayoutPanel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.flowLayoutPanel2.AutoSize = true;
this.flowLayoutPanel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.flowLayoutPanel2.Controls.Add(this.allCheckBox);
this.flowLayoutPanel2.Location = new System.Drawing.Point(520, 9);
this.flowLayoutPanel2.Name = "flowLayoutPanel2";
this.flowLayoutPanel2.Size = new System.Drawing.Size(43, 25);
this.flowLayoutPanel2.TabIndex = 1006;
//
// SelectForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(584, 361);
this.Controls.Add(this.flowLayoutPanel1);
this.Controls.Add(this.scanButton);
this.Controls.Add(this.flowLayoutPanel2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.progressBar1);
this.Controls.Add(this.label1);
@ -185,8 +245,12 @@ namespace CreamInstaller
this.TopMost = true;
this.Load += new System.EventHandler(this.OnLoad);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.flowLayoutPanel1.ResumeLayout(false);
this.flowLayoutPanel1.PerformLayout();
this.flowLayoutPanel2.ResumeLayout(false);
this.flowLayoutPanel2.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
@ -201,7 +265,11 @@ namespace CreamInstaller
private System.Windows.Forms.CheckBox allCheckBox;
private Button scanButton;
private Label noneFoundLabel;
private CustomTreeView treeView1;
private CustomTreeView selectionTreeView;
private CheckBox blockedGamesCheckBox;
private Button blockProtectedHelpButton;
private FlowLayoutPanel flowLayoutPanel1;
private FlowLayoutPanel flowLayoutPanel2;
}
}

View file

@ -221,17 +221,24 @@ namespace CreamInstaller
{
return;
}
// EasyAntiCheat detects DLL changes, so skip those games
if (Directory.Exists(directory + @"\EasyAntiCheat"))
if (Program.BlockProtectedGames)
{
continue;
bool blockedGame = Program.ProtectedGameNames.Contains(name);
if (!Program.ProtectedGameDirectoryExceptions.Contains(name))
{
foreach (string path in Program.ProtectedGameDirectories)
{
if (Directory.Exists(directory + path))
{
blockedGame = true;
}
}
}
if (blockedGame)
{
continue;
}
}
// BattlEye in DayZ detects DLL changes, but not in Arma3?
if (name != "Arma 3" && Directory.Exists(directory + @"\BattlEye"))
{
continue;
}
Task task = Task.Run(() =>
{
if (Program.Canceled || !GetDllDirectoriesFromGameDirectory(directory, out List<string> dllDirectories))
@ -314,6 +321,10 @@ namespace CreamInstaller
selection.SteamAppId = appId;
selection.SteamApiDllDirectories = dllDirectories;
selection.AppInfo = appInfo;
if (allCheckBox.Checked)
{
selection.Enabled = true;
}
foreach (Task task in dlcTasks.ToList())
{
@ -329,7 +340,7 @@ namespace CreamInstaller
return;
}
treeView1.Invoke((MethodInvoker)delegate
selectionTreeView.Invoke((MethodInvoker)delegate
{
if (Program.Canceled)
{
@ -341,7 +352,7 @@ namespace CreamInstaller
programNode.Text = /*(appId > 0 ? $"[{appId}] " : "") +*/ name;
programNode.Checked = selection.Enabled;
programNode.Remove();
treeView1.Nodes.Add(programNode);
selectionTreeView.Nodes.Add(programNode);
treeNodes.Remove(programNode);
treeNodes.Add(programNode);
if (appId == 0) // paradox launcher
@ -357,6 +368,12 @@ namespace CreamInstaller
return;
}
selection.AllSteamDlc[dlcApp.Key] = dlcApp.Value;
if (allCheckBox.Checked)
{
selection.SelectedSteamDlc[dlcApp.Key] = dlcApp.Value;
}
TreeNode dlcNode = treeNodes.Find(s => s.Name == "" + dlcApp.Key) ?? new();
dlcNode.Name = "" + dlcApp.Key;
dlcNode.Text = dlcApp.Value;
@ -365,7 +382,6 @@ namespace CreamInstaller
programNode.Nodes.Add(dlcNode);
treeNodes.Remove(dlcNode);
treeNodes.Add(dlcNode);
selection.AllSteamDlc[dlcApp.Key] = dlcApp.Value;
}
}
});
@ -390,12 +406,14 @@ namespace CreamInstaller
private async void OnLoad(bool validating = false)
{
Program.Canceled = false;
blockedGamesCheckBox.Enabled = false;
blockProtectedHelpButton.Enabled = false;
cancelButton.Enabled = true;
scanButton.Enabled = false;
noneFoundLabel.Visible = false;
allCheckBox.Enabled = false;
acceptButton.Enabled = false;
treeView1.Enabled = false;
selectionTreeView.Enabled = false;
label2.Visible = true;
progressBar1.Visible = true;
@ -459,6 +477,8 @@ namespace CreamInstaller
setup = false;
if (!validating)
{
selectionTreeView.Nodes.Clear();
Program.ProgramSelections.Clear();
label2.Text = "Gathering and caching your applicable games and their DLCs . . . ";
}
@ -479,14 +499,17 @@ namespace CreamInstaller
label2.Visible = false;
progressBar1.Visible = false;
treeView1.Enabled = ProgramSelection.All.Any();
allCheckBox.Enabled = treeView1.Enabled;
noneFoundLabel.Visible = !treeView1.Enabled;
selectionTreeView.Enabled = ProgramSelection.All.Any();
allCheckBox.Enabled = selectionTreeView.Enabled;
noneFoundLabel.Visible = !selectionTreeView.Enabled;
acceptButton.Enabled = ProgramSelection.AllSafeEnabled.Any();
cancelButton.Enabled = false;
scanButton.Enabled = true;
blockedGamesCheckBox.Enabled = true;
blockProtectedHelpButton.Enabled = true;
label2.Text = "Validating . . . ";
if (!validating && !Program.Canceled)
{
@ -567,9 +590,9 @@ namespace CreamInstaller
private void OnLoad(object sender, EventArgs _)
{
treeView1.TreeViewNodeSorter = new TreeNodeSorter();
treeView1.AfterCheck += OnTreeViewNodeCheckedChanged;
treeView1.NodeMouseClick += (sender, e) =>
selectionTreeView.TreeViewNodeSorter = new TreeNodeSorter();
selectionTreeView.AfterCheck += OnTreeViewNodeCheckedChanged;
selectionTreeView.NodeMouseClick += (sender, e) =>
{
if (e.Button == MouseButtons.Right)
{
@ -685,16 +708,9 @@ namespace CreamInstaller
installForm.ShowDialog();
if (installForm.Reselecting)
{
foreach (TreeNode treeNode in treeNodes)
{
if (!(treeNode.Parent is null) || int.Parse(treeNode.Name) == 0)
{
OnTreeViewNodeCheckedChanged(null, new(treeNode, TreeViewAction.ByMouse));
}
}
this.InheritLocation(installForm);
Show();
OnLoad();
}
else
{
@ -731,5 +747,38 @@ namespace CreamInstaller
}
allCheckBox.Checked = shouldCheck;
}
private void OnBlockProtectedGamesCheckBoxChanged(object sender, EventArgs e)
{
Program.BlockProtectedGames = blockedGamesCheckBox.Checked;
OnLoad();
}
private readonly string helpButtonListPrefix = "\n • ";
private void OnBlockProtectedGamesHelpButtonClicked(object sender, EventArgs e)
{
string blockedGames = "";
foreach (string name in Program.ProtectedGameNames)
{
blockedGames += helpButtonListPrefix + name;
}
string blockedDirectories = "";
foreach (string path in Program.ProtectedGameDirectories)
{
blockedDirectories += helpButtonListPrefix + path;
}
string blockedDirectoryExceptions = "";
foreach (string name in Program.ProtectedGameDirectoryExceptions)
{
blockedDirectoryExceptions += helpButtonListPrefix + name;
}
new DialogForm(this).Show(blockedGamesCheckBox.Text, SystemIcons.Information,
"Blocks the program from caching and displaying games protected by DLL checks," +
"\nanti-cheats, or that are confirmed not to be working with CreamAPI." +
"\n\nBlocked game names:" + blockedGames +
"\n\nBlocked game sub-directories:" + blockedDirectories +
"\n\nBlocked game sub-directory exceptions (not blocked):" + blockedDirectoryExceptions,
"OK");
}
}
}

View file

@ -18,6 +18,11 @@ namespace CreamInstaller
public static readonly string CurrentProcessDirectory = CurrentProcessFilePath.Substring(0, CurrentProcessFilePath.LastIndexOf("\\"));
public static readonly string BackupFileExtension = ".creaminstaller.backup";
public static bool BlockProtectedGames = true;
public static readonly string[] ProtectedGameNames = { "PAYDAY 2", "Call to Arms" }; // non-functioning CreamAPI or DLL detections
public static readonly string[] ProtectedGameDirectories = { @"\EasyAntiCheat", @"\BattlEye" }; // DLL detections
public static readonly string[] ProtectedGameDirectoryExceptions = { "Arma 3" }; // Arma 3's BattlEye doesn't detect DLL changes?
[STAThread]
private static void Main()
{