MİNECRAFT SUNUCUNUZ İÇİN ÖZEL BİR MİNECRAFT LAUNCHERI TASARLAYIN
Minecraft Launcher Part 4
Minecraft hayranıysanız ve kendi özelleştirilmiş bir launcher yapmak istiyorsanız, bu kılavuz size C# ve WinForm kullanarak nasıl başlayacağınızı gösterecek. Uygulama, internet bağlantısını kontrol ediyor, kullanıcı girişi sağlıyor ve Minecraft istemcisini başlatıyor. CmlLib.Core ve CmlLib.Core.Auth kütüphanelerini kullanarak adım adım ilerleyin ve özelleştirilmiş Minecraft Launcher’ınızı oluşturun.
Bu makalede, Minecraft hayranları için özelleştirilmiş bir launcher yapmanızı sağlayacak adım adım bir kılavuz sunuyoruz. C# dilini ve WinForm’u kullanarak, internet bağlantısını kontrol eden, kullanıcı girişi sağlayan ve Minecraft istemcisini başlatan bir uygulama oluşturacaksınız. İhtiyacınız olan kütüphaneler ve aşamalar hakkında detaylı bilgiyi aşağıda bulabilirsiniz.
1. Adım: Gerekli Kütüphaneleri Yükleyin
Açıklama: İlk adımda, CmlLib.Core ve CmlLib.Core.Auth kütüphanelerini indirip projenize dahil etmeniz gerekmektedir. Bu kütüphaneler, Minecraft hesap bilgilerini tutmanıza ve Minecraft istemcisini başlatmanıza olanak sağlayacaktır.
2. Adım: Yüklenme Ekranı Oluşturma
Açıklama: Uygulamanızın başlangıcında, internet bağlantısını kontrol ederek yüklenme ekranını göstermeniz gerekmektedir. Bu ekran, kullanıcıya uygulamanın yükleniyor olduğunu gösterir ve ardından login ekranına geçiş yapar.
3. Adım: Kullanıcı Girişi ve Login Ekranı
Açıklama: Minecraft Launcher’ınızda kullanıcıların hesaplarıyla giriş yapabilmeleri için bir login ekranı oluşturmanız gerekmektedir. Bu ekran, kullanıcının Minecraft hesap bilgilerini girmesini sağlar ve giriş başarılı ise ana forma geçiş yapar.<
4. Adım: Ayarlar ve Ana Ekran
Açıklama: Giriş ekranından giriş yaptıktan sonra, kullanıcının minecraft’ı açmak için ayarları yapabileceği bir form açılır. Kullanıcı ayarları yapıp butona basarsa ya form kapanır ya gizlenir ya da açık kalarak oyun açılır (Bu videoda oyun açılmıyor bir sonraki videoda göstereceğim).
SplashScreen.cs C#
using System;
using System.Net.NetworkInformation;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace RL_RoseLone
{
public partial class splashscreen : Form
{
public splashscreen()
{
InitializeComponent();
}
private int counter = 0;
private void splashscreen_Load(object sender, EventArgs e)
{
timer1.Start();
}
private async void timer1_Tick(object sender, EventArgs e)
{
if (await IsConnectedToInternet())
{
loadingtxt.Text = "Bağlantı kuruldu";
timer1.Stop();
await UpdateUI();
}
else
{
loadingtxt.Text = "Bağlantı kurulamadı. Yeniden deneniyor...";
}
}
private async Task IsConnectedToInternet()
{
try
{
using (var ping = new Ping())
{
var result = await ping.SendPingAsync("google.com");
return result.Status == IPStatus.Success;
}
}
catch
{
return false;
}
}
private async Task UpdateUI()
{
while (loadingBar.Value < 100)
{
await Task.Delay(100);
loadingBar.Value += 10;
counter++;
switch (counter)
{
case 2:
loadingtxt.Text = "Kontrol Ediliyor...";
break;
case 4:
loadingtxt.Text = "Kontrol Edildi";
break;
case 6:
loadingtxt.Text = "Kontrol Başarılı";
break;
case 8:
loadingtxt.Text = "Başlatılıyor...";
break;
}
}
Login loginForm = new Login();
loginForm.Show();
Hide();
}
}
}
Bu kod, bir giriş ekranı ile birlikte çalışan bir “splash screen” (açılış ekranı) formunu temsil eder. Bu form, internet bağlantısını kontrol eder ve ardından bir ilerleme çubuğunu güncelleyerek kullanıcıya işlemin durumunu gösterir. İşlem tamamlandığında, formu gizler ve bir giriş formunu gösterir.
İşte aşama aşama yapılması gerekenlerin pseudocode açıklaması:
1. “splashscreen” adında bir Form sınıfı oluşturun.
2. Bir özel değişken “counter” oluşturun ve başlangıç değeri 0 olarak ayarlayın.
3. “splashscreen” sınıfının oluşturucusunu tanımlayın ve InitializeComponent() metoduyla başlatın.
4. “splashscreen_Load” adında bir olay işleyicisi tanımlayın:
a. timer1.Interval değerini 1000 milisaniye olarak ayarlayın.
b. timer1’ı başlatın.
5. “timer1_Tick” adında bir olay işleyicisi tanımlayın:
a. “IsConnectedToInternet” metodunu çağırarak internet bağlantısını kontrol edin ve sonucuna göre işlem yapın:
– Bağlantı varsa:
– loadingtxt metnini “Bağlantı kuruldu” olarak ayarlayın.
– timer1’ı durdurun.
– “UpdateUI” metodunu çağırın ve await ile bekleyin.
– Bağlantı yoksa:
– loadingtxt metnini “Bağlantı kurulamadı. Yeniden deneniyor…” olarak ayarlayın.
6. “IsConnectedToInternet” adında bir asenkron metod tanımlayın:
a. try-catch bloğu içinde aşağıdaki işlemleri yapın:
– Ping sınıfını kullanarak “google.com” adresine ping gönderin ve sonucunu alın.
– Sonucun durumunu kontrol edin ve IPStatus.Success durumunda true döndürün.
b. Hata durumunda veya bağlantı başarısız olduğunda false döndürün.
7. “UpdateUI” adında bir asenkron metod tanımlayın:
a. loadingBar değeri 100’e kadar olduğu sürece dönen bir döngü oluşturun:
– await Task.Delay(100) ile 100 milisaniye bekleyin.
– loadingBar değerini 10 birim artırın.
– counter’ı bir birim artırın ve değerine göre bir switch-case yapısıyla loadingtxt metnini güncelleyin:
– counter 2 ise: “Kontrol Ediliyor…”
– counter 4 ise: “Kontrol Edildi”
– counter 6 ise: “Kontrol Başarılı”
– counter 8 ise: “Başlatılıyor…”
b. İşlem tamamlandığında, Login sınıfından bir örnek oluşturun.
c. loginForm’u gösterin ve splashscreen Formunu kapatın.
Login.cs C#
using CmlLib.Core.Auth;
using System;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace RL_RoseLone
{
public partial class Login : Form
{
public Login()
{
InitializeComponent();
Init_Data();
}
private void CloseBox_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void txtUsername_TextChanged(object sender, EventArgs e)
{
girisbtn.Enabled = txtUsername.Text.Length >= 2;
}
private void UpdateSession(MSession session)
{
var mainForm = new Main();
mainForm.UpdateSession(session);
mainForm.FormClosed += (s, e) => this.Close();
mainForm.Show();
this.Hide();
}
private void TimerEventProcessor(object sender, EventArgs e)
{
UpdateSession(MSession.GetOfflineSession(txtUsername.Text));
Timer1.Stop();
}
private void Init_Data()
{
if (Properties.Settings.Default.Username != string.Empty)
{
if (Properties.Settings.Default.RememberMe == true)
{
txtUsername.Text = Properties.Settings.Default.Username;
Remember.Checked = true;
}
else
{
txtUsername.Text = Properties.Settings.Default.Username;
}
}
}
private void Save_Data()
{
if (Remember.Checked)
{
Properties.Settings.Default.Username = txtUsername.Text.Trim();
Properties.Settings.Default.RememberMe = true;
}
else
{
Properties.Settings.Default.Username = "";
Properties.Settings.Default.RememberMe = false;
}
Properties.Settings.Default.Save();
}
private void girisbtn_Click(object sender, EventArgs e)
{
string input = txtUsername.Text.ToLower();
if (!string.IsNullOrEmpty(txtUsername.Text) && Regex.IsMatch(txtUsername.Text, "^[a-zA-Z]+$"))
{
if (input.Length < 2)
{
hatatxt.Text = "Lütfen 2 den fazla harf girin";
return;
}
txtUsername.Visible = false;
guna2HtmlLabel2.Visible = false;
Remember.Visible = false;
girisbtn.Visible = false;
hatatxt.Visible = false;
Timer1.Tick += new EventHandler(TimerEventProcessor);
Timer1.Start();
loadingbar.Visible = true;
Save_Data();
}
else
{
hatatxt.Text = "Lütfen sadece ingilizce harfler kullanın";
}
}
private void txtUsername_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsLetter(e.KeyChar) && !char.IsControl(e.KeyChar) && !char.IsWhiteSpace(e.KeyChar))
{
e.Handled = true;
}
}
}
}
Bu kod bloğu, bir kullanıcı giriş formunu içeren bir Windows Forms uygulamasını temsil eder. İşlevselliği şu şekildedir:
Login
sınıfı, kullanıcı girişi formunu oluşturan bir Windows Form’u temsil eder.CloseBox_Click
metodu, uygulamayı kapatmak için kullanılır.txtUsername_TextChanged
metodu, kullanıcı adı alanındaki metni izleyerek giriş düğmesini etkinleştirir.UpdateSession
metodu, kullanıcının oturumunu günceller ve ana formu gösterir.TimerEventProcessor
metodu, oturumu güncellemek için bir zamanlayıcı olay işleyicisidir.Init_Data
metodu, uygulamanın başlatılması sırasında kullanıcı ayarlarını başlatır.Save_Data
metodu, kullanıcının tercihlerini kaydeder.girisbtn_Click
metodu, giriş düğmesine tıklanması durumunda çalışan olay işleyicisidir.txtUsername_KeyPress
metodu, sadece harf, boşluk ve kontrol karakterlerini kabul eden bir giriş sınırlayıcıdır.
Kodun genel amacı, kullanıcı giriş bilgilerini yönetmek ve bu bilgilerle bir oturum açmak. Ayrıca, kullanıcının tercihlerini hatırlamak ve uygun işlemleri gerçekleştirmek.
Main.cs
using CmlLib.Core.Auth;
using CmlLib.Core;
using System;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using CmlLib.Core.Version;
using System.Collections.Generic;
namespace RL_RoseLone
{
public partial class Main : Form
{
CMLauncher launcher;
private MSession newsession;
public Main()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
public void UpdateSession(MSession session)
{
newsession = session;
}
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 async Task initializeLauncher(MinecraftPath path)
{
lbUsername.Text = newsession.Username;
launcher = new CMLauncher(path);
}
private void Main_Load(object sender, EventArgs e)
{
path();
var request = WebRequest.Create("https://minotar.net/helm/" + newsession.Username + "/100.png");
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
var bmp = new Bitmap(stream);
userskinpicture.Image = bmp;
}
Init_Data();
}
private void path()
{
MinecraftPath path = new MinecraftPath();
var launcher = new CMLauncher(path);
foreach (var item in launcher.GetAllVersions())
{
if (item.MType != MVersionType.Snapshot && item.MType != MVersionType.OldAlpha && item.MType != MVersionType.OldBeta)
{
var tag = item.IsLocalVersion ? "Yüklü" : item.MType.ToString();
versionBox.Items.Add($"{tag} {item.Name}");
versionBox.SelectedIndex = 0;
}
}
}
private void logoutBtn_Click(object sender, EventArgs e)
{
var f = new Login();
f.Show();
Hide();
}
private void Versions(object sender, EventArgs e)
{
versionBox.Items.Clear();
var betaChecked = showBeta.Checked;
var alphaChecked = showAlpha.Checked;
var snapshotChecked = showSnapshot.Checked;
int selectedIndex = -1;
List versionItems = new List();
foreach (var item in launcher.GetAllVersions())
{
var type = item.MType;
var isLocalVersion = item.IsLocalVersion;
if (betaChecked && type != MVersionType.Snapshot && type != MVersionType.OldAlpha)
{
var tag = isLocalVersion ? "Yüklü" : "Beta";
versionItems.Add($"{tag} {item.Name}");
if (selectedIndex == -1) selectedIndex = versionItems.Count - 1;
}
else if (alphaChecked && type != MVersionType.Snapshot && type != MVersionType.OldBeta)
{
var tag = isLocalVersion ? "Yüklü" : "Alpha";
versionItems.Add($"{tag} {item.Name}");
if (selectedIndex == -1) selectedIndex = versionItems.Count - 1;
}
else if (snapshotChecked && type != MVersionType.OldAlpha && type != MVersionType.OldBeta)
{
var tag = isLocalVersion ? "Yüklü" : "Snapshot";
versionItems.Add($"{tag} {item.Name}");
if (selectedIndex == -1) selectedIndex = versionItems.Count - 1;
}
}
if (versionItems.Count > 0)
{
versionBox.Items.AddRange(versionItems.ToArray());
versionBox.SelectedIndex = selectedIndex;
}
else
{
path();
}
}
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.Resulation;
showSnapshot.Checked = Properties.Settings.Default.Snapshot;
showBeta.Checked = Properties.Settings.Default.Beta;
showAlpha.Checked = Properties.Settings.Default.Alpha;
FullScreenBool.Checked = Properties.Settings.Default.FullScreen;
showSnapshot.Checked = Properties.Settings.Default.Snapshot;
showBeta.Checked = Properties.Settings.Default.Beta;
showAlpha.Checked = Properties.Settings.Default.Alpha;
selectedVersion.Text = Properties.Settings.Default.VersionBox;
}
private void Save_Data()
{
Properties.Settings.Default.Resulation = 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;
if (int.TryParse(RamComboBox.Text, out int value))
Properties.Settings.Default.MaxRam = value;
else
Properties.Settings.Default.MaxRam = 1024;
Properties.Settings.Default.Save();
}
private void saveBtn_Click(object sender, EventArgs e)
{
Save_Data();
SettingsPanel.Visible = false;
settingsBtn.Enabled = true;
selectedVersion.Text = Properties.Settings.Default.VersionBox;
}
private void settingsBtn_Click(object sender, EventArgs e)
{
if (!SettingsPanel.Visible)
{
Init_Data();
SettingsPanel.Visible = true;
}
else
{
DialogResult result = settingsWarning.Show();
if (result == DialogResult.OK)
{
SettingsPanel.Visible = false;
settingsBtn.Enabled = true;
Init_Data();
}
}
}
private void girisbtn_Click(object sender, EventArgs e)
{
string selectedItem = launcherstatusBox.SelectedItem?.ToString();
if (selectedItem == "Gizle")
{
Hide();
}
else if (selectedItem == "Açık")
{
Show();
}
else if (selectedItem == "Kapat")
{
Environment.Exit(0);
}
}
private void FullScreenBool_CheckedChanged(object sender, EventArgs e)
{
if (FullScreenBool.Checked)
{
cmbDisplayMode.Enabled = false;
}
else
{
cmbDisplayMode.Enabled = true;
}
}
}
}
Kod, bir Windows Forms uygulaması olarak tasarlanmıştır. İlk olarak, gerekli olan kullanıcı arabirimi bileşenlerini içeren bir form oluşturulur. Ardından, kullanıcının oturum bilgilerini tutan bir `MSession` nesnesi oluşturulur.
initializeLauncher Fonksiyonu
Bu fonksiyon, Minecraft oyununun yüklü olduğu dizin yolunu alır ve `CMLauncher` sınıfını başlatır. Bu sınıf, Minecraft’ın başlatılması, sürümlerin listelenmesi ve seçilen bir sürümün başlatılması gibi işlemleri gerçekleştirmek için kullanılır.
Main_Load Fonksiyonu
Bu fonksiyon, form yüklendiğinde otomatik olarak çağrılır. İlk olarak, kullanıcının kullanıcı adını kullanarak bir URL’ye istek gönderir ve kullanıcının avatarını içeren bir resmi alır. Bu resim, formdaki bir resim kutusuna yerleştirilir. Ardından, `Init_Data` fonksiyonu çağrılır.
path Fonksiyonu
Bu fonksiyon, yüklü olan Minecraft sürümlerini bulmak için `CMLauncher` sınıfını kullanır. Sürümler bir döngü aracılığıyla alınır ve beta, alpha veya snapshot sürümleri olmayan sürümler listelenir. Listelenen sürümler, bir liste kutusuna eklenir ve varsayılan olarak seçilen sürüm ayarlanır.
logoutBtn_Click Fonksiyonu
Bu fonksiyon, kullanıcının oturumunu kapatmak için kullanılır. Oturum kapatıldıktan sonra `Login` formu açılır ve bu form gizlenir.
Versions Fonksiyonu
Bu fonksiyon, kullanıcının sürüm tercihlerini güncellemek için kullanılır. Beta, alpha veya snapshot sürümlerini göstermek veya gizlemek için ilgili onay kutularının durumuna bağlı olarak sürümler yeniden listelenir. Yeni bir sürüm seçildiğinde, seçilen sürüm etiketi güncellenir.
Init_Data Fonksiyonu
Bu fonksiyon, kullanıcının daha önce kaydettiği tercihleri alır ve uygulama ayarlarını bu tercihlere göre günceller. Örneğin, RAM miktarı, seçilen sürüm, dil tercihi, tam ekran modu gibi ayarlar kaydedilir ve uygulama yeniden başlatıldığında bu tercihler geri yüklenir.
Save_Data Fonksiyonu
Bu fonksiyon, kullanıcının yaptığı ayar değişikliklerini kaydetmek için kullanılır. Örneğin, ekran çözünürlüğü, seçilen sürüm, dil tercihi gibi ayarlar kaydedilir ve bir sonraki kullanımda bu ayarlar kullanılır.
saveBtn_Click Fonksiyonu
Bu fonksiyon, “Kaydet” düğmesine tıklandığında çağrılır. Kullanıcının yaptığı ayar değişiklikleri `Save_Data` fonksiyonu kullanılarak kaydedilir. Ayarlar paneli gizlenir ve “Ayarlar” düğmesi tekrar etkin hale gelir. Ayrıca, seçilen sürüm etiketi güncellenir.
settingsBtn_Click Fonksiyonu
Bu fonksiyon, “Ayarlar” düğmesine tıklandığında çağrılır. Ayarlar paneli görünür hale getirilir ve kullanıcının tercihlerini düzenlemesine olanak tanır. Eğer ayarlar paneli zaten görünürse, kullanıcıya bir uyarı mesajı gösterilir ve değişiklikleri iptal etmek veya kaydetmek için seçenekler sunulur.
girisbtn_Click Fonksiyonu
Bu fonksiyon, “Giriş” düğmesine tıklandığında çağrılır. Kullanıcının seçtiği duruma göre (Gizle, Açık, Kapat), formun görünürlüğü ayarlanır. Bu şekilde, kullanıcı uygulamayı gizleyebilir, tekrar görüntüleyebilir veya tamamen kapatılmasını sağlayabilir.
FullScreenBool_CheckedChanged Fonksiyonu
Bu fonksiyon, tam ekran modu seçeneğinin durumu değiştirildiğinde çağrılır. Eğer tam ekran modu seçiliyse, çözünürlük seçim kutusu devre dışı bırakılır. Aksi takdirde, çözünürlük seçimi etkin hale getirilir.
Bu kodlar, Winform uygulaması geliştirmeye yeni başlayanların veya C# programlamayla yeni tanışanların Minecraft launcher uygulaması geliştirme konusunda fikir sahibi olmalarına yardımcı olabilir.
Bilgilendirme C# Minecraft Launcher Eğitim Kodlama Launcher Minecraft Launcher Nasıl Yapılır WinForm Minecraft Launcher Yeni
It is appropriate time to make some plans for the longer term and it is time
to be happy. I’ve learn this put up and if I may
I wish to counsel you few attention-grabbing things or tips.
Perhaps you could write next articles regarding this article.
I desire to learn more things about it!
Hola! I’ve been following your site for a while now and finally
got the bravery to go ahead and give you a shout
out from Houston Tx! Just wanted to say keep up the good
job!
Hey people!!!!!
Good mood and good luck to everyone!!!!!
abi yavarırım gör bende getallversions çalışmıyor
Discord adresine gelip oradan ekran görüntüsü atabilirmisin
Discord linki:
https://bit.ly/3oIEOiZ