MİNECRAFT SUNUCUNUZ İÇİN ÖZEL BİR MİNECRAFT LAUNCHERI TASARLAYIN
Minecraft Launcher PART 5
Merhaba ve Hoş Geldiniz!
Blogumuza hoş geldiniz! Burası, alonehuntert’ın Windows Form uygulamalarının inceliklerini keşfettiğimiz bir mekanı. Burada, kod parçalarının gizemli dünyasını aydınlatmak ve uygulama geliştirme yolculuğunda size rehberlik etmek için bulunuyoruz.
Minecraft’a hoş geldiniz! Bu efsanevi oyunun milyonlarca hayranı var ve biz de onlardan biriyiz. Ancak bazı oyuncular, orijinal Minecraft Launcher’ını kullanmak yerine farklı seçenekler arıyorlar. Belki kendi sunucularını kurmak istiyorlar ya da oyun deneyimlerini özelleştirmek için farklı bir yol arıyorlar. İşte tam da bu noktada devreye giriyoruz: Windows Form uygulamalarını kullanarak kendi Minecraft Launcher’ınızı oluşturabilirsiniz.
Bu yazıda, WinForms kullanarak bir Minecraft Launcher uygulaması yapmanın temellerini öğrenmenizi hedefliyoruz. İsterseniz önceden oluşturduğumuz projeyi açabilir ve birlikte başlayabiliriz. Ayrıca, projeyi gerçek bir launcher yapmak için ihtiyacımız olan özellikleri eklemeyi de öğreneceksiniz.
Uygulamanızı oluştururken karşılaşabileceğiniz zorlukların üstesinden birlikte geleceğiz. Hazırsanız, başlamak için sabırsızlanıyoruz!
İyi okumalar dileriz!
SplashScreen.cs C#
private void CloseBox_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void SplashScreen_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
private void SplashScreen_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
Login.cs C#
private void CloseBox_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void Login_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
private void Login_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
Bu kod parçaları, bir Windows Form uygulamasında bir kullanıcı formu kapattığında uygulamanın nasıl kapatılacağını belirler. Kodları tek tek açıklayalım:
- 1. CloseBox_Click Metodu:
Bu metod, bir “CloseBox” adlı kontrol öğesine tıklandığında tetiklenir. Bu kontrol genellikle bir formun sağ üst köşesindeki kapatma düğmesidir. Bu metod, `Application.Exit()` yöntemini çağırarak uygulamayı kapatır.
- 2. Login_FormClosed ve SplashScreen_FormClosed Metodu:
Bu metod, kullanıcı giriş formu kapatıldığında tetiklenir. `FormClosed` olayı, bir formun tamamen kapandığını bildirir. Bu metod da `Application.Exit()` yöntemini çağırarak uygulamayı kapatır.
- 3. Login_FormClosing ve SplashScreen_FormClosing Metodu:
Bu metod, kullanıcı giriş formu kapatılmaya çalışıldığında tetiklenir. `FormClosing` olayı, bir formun kapatılmak üzere olduğunu bildirir, ancak henüz tamamen kapatılmamıştır. Bu metod da `Application.Exit()` yöntemini çağırarak uygulamayı kapatır.
Bu kodlar, farklı form kapatma senaryolarında uygulamanın düzgün bir şekilde sonlandırılmasını sağlar. Başka bir form kapatıldığında veya uygulama kapatılmaya çalışıldığında, `Application.Exit()` yöntemi çağrılarak uygulama güvenli bir şekilde sonlandırılır.
Main.cs
private void AutoRamComboBox()
{
try
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem");
foreach (ManagementObject wmi in searcher.Get())
{
ulong totalMemory = (ulong)wmi["TotalPhysicalMemory"];
long mb = (long)(totalMemory / (1024 * 1024)); // Byte cinsinden toplam fiziksel belleği megabayt cinsine dönüştür.
long startingMemory = 2048;
long increment = 1024;
List ramItems = new List();
for (long i = startingMemory; i <= mb; i += increment)
{
ramItems.Add($"{i} MB"); // Öğeleri RamComboBox'a ekleyin.
}
RamComboBox.Items.AddRange(ramItems.ToArray());
RamComboBox.SelectedIndex = 0; // Varsayılan olarak ilk öğeyi seçin.
}
}
catch (Exception ex)
{
MessageBox.Show($"Bellek bilgileri alınamadı: {ex.Message}");
}
}
private void CloseBox_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void GameProcess_Exited(object sender, EventArgs e)
{
Invoke((MethodInvoker)delegate
{
girisbtn.Enabled = true;
if (openCheckBox.Checked == false)
{
Application.Exit();
};
if (openCheckBox.Checked == true)
{
Show();
};
});
}
private string getAvatarUrl(string uuid) { return $"https://mc-heads.net/head/{uuid}"; }
private void girisbtn_Click(object sender, EventArgs e)
{
if (launcher == null)
{
MessageBox.Show("Launcher ayarlarınızı kontrol edin!");
return;
}
if (Properties.Settings.Default.VersionBox == "")
{
MessageBox.Show("Bir Versiyon Seçin!");
return;
}
girisbtn.Enabled = false;
Thread thread = new Thread(() => Launch());
thread.IsBackground = true;
thread.Start();
}
private void Init_Data()
{
if (string.IsNullOrWhiteSpace(Properties.Settings.Default.Username)) return;
RamComboBox.Text = Properties.Settings.Default.MaxRam.ToString();
versionBox.Text = Properties.Settings.Default.VersionBox;
comboBoxLanguages.Text = Properties.Settings.Default.Locazition;
launcherstatusBox.Text = Properties.Settings.Default.Status;
cmbDisplayMode.Text = Properties.Settings.Default.Resolution;
showSnapshot.Checked = Properties.Settings.Default.Snapshot;
showBeta.Checked = Properties.Settings.Default.Beta;
showAlpha.Checked = Properties.Settings.Default.Alpha;
FullScreenBool.Checked = Properties.Settings.Default.FullScreen;
selectedVersion.Text = Properties.Settings.Default.VersionBox;
openCheckBox.Checked = Properties.Settings.Default.closeafterclose;
}
private async void Launch()
{
string maxRamString = Properties.Settings.Default.MaxRam;
string[] parts = maxRamString.Split(' ');
string ramString = parts[0];
System.Net.ServicePointManager.DefaultConnectionLimit = 256;
var path = new MinecraftPath();
var launcher = new CMLauncher(path);
var launchOption = new MLaunchOption
{
MaximumRamMb = int.Parse(ramString),
Session = CreateFakeSession(newsession.Username),
FullScreen = Properties.Settings.Default.FullScreen,
ScreenWidth = int.Parse(Properties.Settings.Default.screenWidth),
ScreenHeight = int.Parse(Properties.Settings.Default.screenHeight),
};
string selectedItem = Properties.Settings.Default.VersionBox.ToString();
string[] split = selectedItem.Split(' ');
string versionNumber = split[1];
var process = await launcher.CreateProcessAsync(versionNumber, launchOption);
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.StandardErrorEncoding = System.Text.Encoding.UTF8;
process.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8;
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(GameProcess_Exited);
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
if (launcherstatusBox.SelectedIndex == 0) { Hide(); }
}
public static MSession CreateFakeSession(string username)
{
return new MSession
{
Username = username,
UUID = "2749420bc7a54b05ab622b34e61b8a79",
AccessToken = "accesstoken",
UserType = "Mojang"
};
}
private void Main_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
private void Main_Load(object sender, EventArgs e)
{
path();
IPStatus status = IPStatus.Unknown;
try { status = new Ping().Send("google.com").Status; } catch { }
userskinpicture.ImageLocation = (status == IPStatus.Success) ? getAvatarUrl(newsession.Username) : "";
Init_Data();
AutoRamComboBox();
}
private async void Main_Shown(object sender, EventArgs e)
{
var defaultPath = new MinecraftPath(MinecraftPath.GetOSDefaultPath());
await initializeLauncher(defaultPath);
showBeta.CheckedChanged += Versions;
showAlpha.CheckedChanged += Versions;
showSnapshot.CheckedChanged += Versions;
}
private void openCheckBox_CheckedChanged(object sender, EventArgs e)
{
if (openCheckBox.Checked == true)
openCheckBox.Text = $"Minecraft kapandığında : Açık";
else
openCheckBox.Text = $"Minecraft kapandığında : Kapat";
}
private void Save_Data()
{
Properties.Settings.Default.Resolution = cmbDisplayMode.Text;
Properties.Settings.Default.VersionBox = versionBox.Text;
Properties.Settings.Default.Locazition = comboBoxLanguages.Text;
Properties.Settings.Default.Status = launcherstatusBox.Text;
Properties.Settings.Default.FullScreen = FullScreenBool.Checked;
Properties.Settings.Default.Snapshot = showSnapshot.Checked;
Properties.Settings.Default.Beta = showBeta.Checked;
Properties.Settings.Default.Alpha = showAlpha.Checked;
Properties.Settings.Default.closeafterclose = openCheckBox.Checked;
Properties.Settings.Default.MaxRam = RamComboBox.Text;
string selectedResolution = Properties.Settings.Default.Resolution.ToString();
string[] resolutionParts = selectedResolution.Split('x');
Properties.Settings.Default.screenWidth = resolutionParts[0];
Properties.Settings.Default.screenHeight = resolutionParts[1];
Properties.Settings.Default.Save();
}
1. AutoRamComboBox Metodu:
– Bu metod, bilgisayarın toplam fiziksel belleğini megabayt cinsine dönüştürerek kullanıcıya sunar.
– İlk olarak, `ManagementObjectSearcher` nesnesi oluşturarak WMI (Windows Yönetim Enstrümantasyonu) üzerinden bilgisayarın toplam fiziksel belleğini alır.
– Ardından, bu belleği megabayt cinsine dönüştürür ve başlangıç belleği (startingMemory) ve artış miktarı (increment) belirler.
– Belirlenen aralıkta RAM miktarı seçeneklerini oluşturur ve bunları `RamComboBox` adlı bir ComboBox’a ekler.
– Son olarak, varsayılan olarak ilk seçeneği seçer.
2. CloseBox_Click Metodu:
– Bu metod, uygulama penceresinin kapatma düğmesine tıklandığında çağrılır.
– `Application.Exit()` yöntemini çağırarak uygulamayı kapatır.
3. GameProcess_Exited Metodu:
– Bu metod, Minecraft oyunu kapandığında çağrılır.
– Eğer “Minecraft kapandığında” seçeneği işaretlenmemişse, uygulamayı kapatır.
– Aksi takdirde, formu yeniden gösterir.
4. getAvatarUrl Metodu:
– Bu metod, bir UUID’yi alarak bu UUID’ye bağlı bir Minecraft avatarının URL’sini oluşturur ve döndürür.
5. girisbtn_Click Metodu:
– Bu metod, kullanıcı giriş butonuna tıklandığında çağrılır.
– Önce, launcher’ın doğru şekilde yapılandırılmış olup olmadığını ve bir sürüm seçilip seçilmediğini kontrol eder.
– Ardından, giriş butonunu devre dışı bırakır ve yeni bir iş parçacığı (thread) oluşturarak oyunu başlatır.
6. Init_Data Metodu:
– Bu metod, kullanıcının önceki oturumunda yaptığı ayarları yükler.
– Eğer kullanıcının kullanıcı adı yoksa, metot direkt olarak işlem yapmadan geri döner.
– Aksi takdirde, `Properties.Settings.Default` üzerinden kaydedilmiş ayarları kullanarak RAM miktarı, sürüm, dil tercihi, ekran çözünürlüğü gibi önceki ayarları yükler.
7. Launch Metodu:
– Bu metod, Minecraft’ı başlatmak için kullanılır.
– İlk olarak, kullanıcının seçtiği maksimum RAM miktarını alır ve launchOption adlı bir MLaunchOption nesnesine atar.
– Daha sonra, seçilen sürüm numarasını alır ve bu sürümü başlatmak için gerekli olan işlemi başlatır.
– Başlatılan işlem için bazı ayarlar yapar ve oyunun durumu değiştiğinde gerekli işlemleri gerçekleştirir.
8. CreateFakeSession Metodu:
– Bu statik metot, bir kullanıcı adı alarak sahte bir oturum (session) oluşturur ve geri döndürür.
9. Main_FormClosed ve Main_FormClosing Metodları:
– Bu metodlar, ana formun kapatılmaya çalışıldığında veya tamamen kapatıldığında uygulamayı kapatır.
– Bir önceki metod gibi, `Application.Exit()` yöntemini kullanarak uygulamayı sonlandırır.
10. Main_Load Metodu:
– Bu metod, ana form yüklendiğinde tetiklenir.
– İlk olarak, Minecraft skin resmini almak için bir istek yapar ve bu resmi kullanıcıya gösterir.
– Daha sonra, `Init_Data` metodunu çağırarak önceki oturumun ayarlarını yükler.
– Son olarak, `AutoRamComboBox` metodunu çağırarak kullanıcıya RAM miktarı seçeneklerini sunar.
11. Main_Shown Metodu:
– Bu metod, ana formun gösterildiğinde tetiklenir.
– İlk olarak, Minecraft’ı başlatmak için varsayılan bir yol belirler.
– Ardından, `initializeLauncher` metodunu çağırarak launcher’ı başlatır.
– Son olarak, `Versions` metodunu tetikleyen olay dinleyicilerini ayarlar.
12. openCheckBox_CheckedChanged Metodu:
– Bu metod, “Minecraft kapandığında” onay kutusunun durumunu değiştirdiğinde tetiklenir.
– Eğer onay kutusu işaretlenmişse, metin olarak “Minecraft kapandığında: Açık” yazısını gösterir; aksi takdirde “Minecraft kapandığında: Kapalı” yazar.
13. Save_Data Metodu:
– Bu metod, kullanıcının yaptığı değişiklikleri kaydeder.
– `Properties.Settings.Default` üzerinden kullanıcının seçtiği çözünürlük, sürüm, dil tercihi gibi ayarları kaydeder ve sonraki oturumlarda kullanmak üzere saklar.
Her bir metod, uygulamanın farklı yönlerini yönetir ve bir araya gelerek kullanıcı deneyimini olabildiğince sorunsuz hale getirir.
Bilgilendirme C# Minecraft Launcher Eğitim Kodlama Launcher Minecraft Launcher Nasıl Yapılır WinForm Minecraft Launcher Yeni