İçeri gel
Yeni başlayanlar ve profesyoneller için tüm bilgisayar sırları
  • Acemi bir kullanıcı için: 1C:Enterprise program sisteminin yazılım ürünleri arasındaki farklar
  • Program 1s 8.3 demo sürümü. Mobil uygulama "UNF" YENİ
  • Şirketimizin 1C yönetimini sıfırdan kurmak
  • Warface'e ücretsiz kayıt
  • World Of Tanks oyununa kayıt – bilmeniz gerekenler nelerdir?
  • Starcraft II Stratejisi ve Taktikleri
  • Stronghold Kingdoms için bir bot yazıyorum. Stronghold Kingdoms için bir bot yazma Oyun kale krallıkları için çalışma kodları

    Stronghold Kingdoms için bir bot yazıyorum.  Stronghold Kingdoms için bir bot yazma Oyun kale krallıkları için çalışma kodları

    Gerçek bir macera için başka bir çağa taşınmak ister misiniz? Bilgisayarınızda ücretsiz bir çevrimiçi oyun çalıştırın "Kale Krallıkları" ve acımasız ortaçağ savaşlarında şansınızı deneyin. Damarlarınızda soğuyan kanın nasıl olduğunu hissedin, ne kadar adrenalin taşıdığınızı öğrenin. Oyuna derinlemesine dalmanın etkisi garanti edilir. Stronghold Kingdoms Eylül-Ekim 2019 – gerçek bir kahraman gibi hissedin!

    Oyuncular kendilerini, ev inşa etmekten kale savunmaya, savaşa katılmaya kadar alışmaları ve yerleşmeleri gereken tehlikelerle dolu bir ortaçağ dünyasında buluyorlar.

    Oyun özellikleri:

    • oyuncular zamana karşı dayanıklı orta çağ kaleleri inşa edip genişletebilirler;
    • katılımcılar verimliliği artırmak için binaları köylere doğru şekilde yerleştirerek köyleri yönetir;
    • Bir takas kartının yardımıyla oyuncular ticaret yapabilecek, keşfedebilecek, keşif yapabilecek vb.;
    • güç kazanmak için yüksek unvanlara giden yolda yürümek;
    • Hayati bir avantaj elde etmek için stratejik kartlarınızı oluşturun ve oynayın.

    Bu oyundaki gerilim çok yüksek seviyelere ulaşacak ve zafer, gerçek bir coşku hissetmenizi sağlayacak. Yaratıcılar düzenli olarak oyunun yeni sürümlerini geliştiriyorlar. Her güncellemeyle yeni bir şeyler eklenir, fırsatlar genişletilir ve oyun daha da parlak, daha çok yönlü ve daha ilginç hale gelir.

    Stronghold Kingdoms Eylül-Ekim 2019 oyunu için kupon nasıl uygulanır?

    Çok beğenilen "gizli kelimeyi" elde etmek için, web sitemizde indirimin işe yaradığı ürünlerden birini seçin ve fareye tıklayın, ardından sistem otomatik olarak benzersiz bir sembolik sayı verir. Herkes Stronghold Kingdoms oyunu için bir promosyon kodu uygulayabilir: ücretli hizmetlere kaydolurken alınan numarayı kopyalayın, bağlantıyı takip edin ve harf ve rakam kombinasyonunu özel alana yapıştırın. İndirim kuponları yalnızca sınırlı bir süre için geçerlidir, bu nedenle her zaman promosyonun zamanlamasına dikkat edin. Kural olarak, kuponlardaki indirimler, ücretli hesaplardaki ve "Özel teklif" olarak işaretlenen diğer oyun hizmetlerindeki indirimlerle birleştirilemez.

    Oyun, Firefly Studios'un resmi web sitesinden oyun istemcisinin indirilmesiyle ücretsiz olarak dağıtılmaktadır.

    Lütfen bekleyin, promosyon kodları yükleniyor

    Güncel Stronghold Kingdoms bonus kodları ve promosyon kodları web sitemizde doğrudan bu sayfada yer almaktadır. Stronghold Kingdoms, popüler Stronghold oyununun yaratıcılarının sunduğu en yeni tarayıcı stratejisidir.

    Oyun, istemciyi bilgisayarlarına indirmek istemeyen hayranlar için harika. Artık Çevrimiçi modda olduğunuz için oyunun eski sürümünün tüm hayranları oyundan keyif alacak. Artık düşmanlarınız botlar değil insanlardır. Şehrinizin yıkılmaması için stratejik ve ekonomik becerilerinizi göstermeniz gerekiyor. Oyunu ilk kez duyanların bilmesi gereken birkaç şey var. Öncelikle kendinizi hemen Orta Çağ'da, Haçlı Seferleri ve çeşitli tarihi olaylar sırasında buluyorsunuz. Şehrinizi inşa etmeniz, yüksek bir duvarla çitlemeniz, yemek, eğlence sistemi kurmanız ve tabii ki kendi ordunuzu kurmanız gerekiyor. Oyun birçok farklı oyunu bir araya getiriyor çünkü nüfusun ruh halini ve şehrin gelişimini takip etmeniz gerekiyor, haritanın diğer ucunda ise savaşları yönetiyorsunuz. Birçok ırk ve birlik kategorisi vardır. Güçlü şövalyelerden sıradan soygunculara. Oyun politikanızı nasıl yürüteceğinize karar vermek size kalmıştır. Ancak oyun kesinlikle hafızanızda bir iz bırakacaktır çünkü böyle bir geliştirme sistemiyle pratikte bu kadar akılda kalıcı ve canlı hiçbir şey yoktur. Tüm olaylar gerçek zamanlı olarak gerçekleştiğinden kararların hızlı ve dikkatli bir şekilde alınması gerekecektir.
    Size büyük indirimler ve bonuslar veren Stronghold Kingdoms oyunu için promosyon kodları sağlıyoruz. Onlar sayesinde büyük bir ordu kiralayıp en yakın oyuncu yerleşimlerini ele geçirebilir veya haritanın başkenti olmaya layık bir şehir geliştirebilirsiniz. Bu oyunun promosyonları web sitemizde sürekli olarak güncellenmektedir, tüm etkinliklerden haberdar olun.

    Kullanıcıları Stronghold Kingdoms oyununa çeken şey:

    • Dünyanın her yerinden birçok oyuncuyla etkileşime girme yeteneği: ticaret, savaşlar, kale ele geçirme, casusluk ve çok daha fazlası;
    • Disiplinleri inceleme ve geliştirme fırsatı var. (Örneğin: tarım, sanayi, ticaret, askeri işler);
    • Her şeyin bölgelere (ilçelere) ayrıldığı küresel il haritası. Bu alanların her biri oyuncu için bir tür vatan olacak;
    • Canlı oyunculara ve bilgisayar rakiplerine karşı oyun (Haydut kampı, kurt ini, düşman kuşatma kampı ve Fare, Yılan, Yaban Domuzu ve Kurt kaleleri). AI, oyuncunun mülklerine baskın yapabilir, bu nedenle korumaya dikkat etmeye değer!
    Uzun bir süre bu oyun için bot yazma konusuna yaklaştım ama ya tecrübem yoktu, tembeldim ya da konuya yanlış yönden yaklaşmaya çalıştım.
    Sonuç olarak C#'ta kod yazma ve tersine mühendislik konusunda deneyim kazandıktan sonra hedefime ulaşmaya karar verdim.

    Evet, fark etmiş olabileceğiniz gibi, C# kolay değil; oyun .net 2.0 kullanılarak yazıldı ve bu daha sonra benim çarklarıma bazı jantlar yerleştirdi.

    Başlangıçta, yalnızca bir ağ protokolünü taklit edecek (hiçbir şekilde şifrelenmeyen) ve "kaynak kodlarının" (il kodunun derlenmesinin sonucu) üçüncü bir zamanda kolayca geri yüklenebileceği bir soket botu yazmayı düşündüm. -parti uygulaması.

    Ama bana sıkıcı ve kasvetli geldi, çünkü elinizde o "kaynak kodları" varsa neden bisikletle uğraşasınız ki?

    Reflektör ile donanmış olarak oyunun giriş noktasını anlamaya başladım (kodu üç yıldan fazla bir süredir hiç gizlenmemiş, geliştiricilere hayret ediyorum) - özel bir şey değil.

    Analiz ve kısmen yanlış karar
    Açıkçası oyun projesi başlangıçta bir konsol uygulaması olarak oluşturuldu:

    Bir giriş noktası olarak Private static void Main(string args) ve Program sınıfı buna işaret ediyor; bu arada, sınıf da özeldir.

    Her şeyden önce, ne bekleyeceğimi bilmeden, yine Reflektör'ü ve buna Reflexil ilavesini kullanarak sınıfı ve yöntemi herkese açık hale getirmek için acele ettim.

    Ancak aniden değiştirilmiş bir dosyayı indiren bir başlatıcıyla karşılaştım.
    Aynı Reflektör ile kısa bir süre onunla mücadele ettikten ve otopsi yaptıktan sonra, oyunun çalıştırılabilir dosyasına iletilen argümanları ayarlamak için kodu çıkardım:

    If (DDText.getText(0x17) == "XX") parametreler = new string ( "-InstallerVersion", "", "", "st" ); // st == steam else parametreler = new string ( "-InstallerVersion", "", "" ); parametreler = SelfUpdater.CurrentBuildVersion.ToString(); parametreler = DDText.getText(0); // Etrafı araştırdıktan sonra bunun oyunun dili olduğunu, “ru”, “de”, “en” vb. biçiminde olduğunu öğrendim. Başlatıcının yanındaki local.txt dosyasından yüklenir. UpdateManager.SetCommandLineParameters(parametreler); // Ve bu da en yaygın System.Diagnostics.Process UpdateManager.StartApplication() için onların sarmalayıcısıdır;

    Şuna bakalım:

    If (DDText.getText(0x17) == "XX") - Başlatıcının yanındaki local.txt dosyasından bir satır.
    Buharlı/buharsız versiyonları için çok tuhaf bir kontrolleri var: X – buhar yok, XX – buhar. :\
    parametreler = SelfUpdater.CurrentBuildVersion - Başlatıcı sürümü, daha sonra öğrendiğim gibi istemcideki kontrol garip olmasına rağmen sakin bir şekilde atlıyor ve mevcut olandan çok daha büyük bir sayı, "yedekte" belirtebilirsiniz, çünkü kontrol, deyim yerindeyse, "büyükten küçük" sayıların karşılaştırılması yoluyla bir versiyonun yalnızca eskiliği içindir.
    parametreler = DDText.getText(0) - Sürümü oluşturduktan sonra bunun oyunun dili olduğunu, "ru", "de", "en" vb. biçiminde olduğunu öğrendim.
    Ayrıca local.txt dosyasından da yüklenir.

    Bu arada, başlatıcı sürümü şuna benziyor:

    Static SelfUpdater() ( currentBuildVersion = 0x75; // 117, yani aslında 1.17. )

    Ve sihirli bir toplu iş dosyası hazırladım:

    StrongholdKingdoms.exe -InstallerVersion 117 tr

    Bunu yapabilmenize rağmen:

    StrongholdKingdoms.exe -InstallerVersion 100500 ru

    Biraz daha yüksekte bahsettiğim şey buydu.

    Yani elimizde olan şey: biraz değiştirilmiş bir istemci ve bir başlatıcı bypass sistemi, eğer buna böyle diyebilirseniz.
    Tüm bunları çalıştırmayı denedikten sonra oyunun çalıştığını ve yamalarımın ona zarar vermediğini görüyorum (gerçi neden zarar versin ki).

    Bundan sonra oyunun çalıştırılabilir dosyasını sınıf kütüphanesi olarak projeye bağlamayı ve oyunun ad alanını – Kingdoms'ı bağlamayı denedim.

    Sonra çok fazla kod ekledim: Main'i çağırmayı ve Programm sınıfını taklit etmeyi denedim, ancak bir nedenden ötürü, onu çalıştırmayı denediğimde oyun, dotnet olmayan çerçevenin çalışma zamanı çökmesiyle çöktü.
    Oyunun çok sayıda C# olmayan kitaplık ve çok sayıda güvenli olmayan kod kullandığından bahsetti. Gerçek bir neden bulamadım.

    Karar doğru
    Uzun zamandır acı çektiğim ve bir çözüm bulamadığım için pes ettim. Ancak bazı nedenlerden dolayı Terraria sunucusunun çatalını hatırladım - TShock (evet, elbette bir çatal - adamlar aynı zamanda kod çözücüyle de eğlendiler) ve DLL'lerden modüller (modlar/eklentiler) yüklemesi.

    Bu fikri ilginç buldum. Google'da aradıktan sonra hem bir yöntem hem de bir kod buldum.
    Biraz araştırıp kendi projemde test ettikten sonra, işe yaradığını görünce dehşete düştüm (birdenbire!).
    Aslında kod:

    System.Reflection.Assembly A = System.Reflection.Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll"); Type ClassType = A.GetType("BotDLL.Main", true); nesne Obj = Activator.CreateInstance(ClassType); System.Reflection.MethodInfo MI = ClassType.GetMethod("Enjekte Et"); MI.Invoke(Obj, null);

    Kodlara bakalım:
    System.Reflection.Assembly - Bu, dosyaları bir projeye bağlarken yalnızca koddan dosyalara bağlantılar oluşturmaktan sorumlu olan şeydir. Ayrıca proje sürümleriniz ve telif haklarınızla ilgili bilgileri de saklar (evet, tüm projelerinizde aynı AssemblyInfo.cs).
    Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll") - Kitaplığımızı yükleyin.
    Daha sonra, aslında botun başlangıcı olan Inject() sınıfının içindeki işlevi çağırırız. =)
    Çizdiğim kodu üçüncü taraf bir uygulamada denedim; enjeksiyon işe yaradı.

    İstemciyi yamalama
    Şimdi işin eğlenceli kısmına geçelim; meydan okuma kodunu oyuna uygulayalım.
    Reflexil kullanarak kodu değiştirerek bunu Main'e küstahça yapıştırmaya çalıştıktan sonra, derlemenin sonucu olarak yama yapılamayan şeyleri yamalamak için başarıyla gönderildi. Ya da belki sadece tembeldim, önemli değil.
    Üçüncü taraf işlevlere (ana if dalları vb. dışında) garantili bir çağrı için bu Main'i aramaya gittim ve oldukça hızlı bir şekilde, başlatıldığında oyun ayarlarını yükleyen MySettings.load() işlevine yapılan bir çağrı buldum.
    Ancak yine elmas olmadan derlemek istemeyen bir kod dağı olduğu ortaya çıktı.
    Ancak şans eseri, onun yanında oyun başladığında tek bir bool değeri döndüren bir Boolean işlevi hasLoggedIn() vardır:
    return (this.HasLoggedIn || (this.Username.Length > 0));
    Bu beni hemen sevindirdi ve bu fonksiyon hemen şuna dönüştü:

    If (!IsStarted) ( System.Reflection.Assembly A = System.Reflection.Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll"); Type ClassType = A.GetType("BotDLL.dll) Main", true); object Obj = Activator.CreateInstance(ClassType); System.Reflection.MethodInfo MI = ClassType.GetMethod("Inject"); MI.Invoke(Obj, null); IsStarted = true; ) return (this. HasLoggedIn || (this.Username.Length > 0));

    Onunla ilgilenelim.
    if (!IsStarted) – bu kontrolü eklemek zorundaydık ve bunu yapmak için MySettings sınıfına ek bir alan eklemek zorundaydık, çünkü fonksiyonumuz birden fazla çağrıldı ve aslında birden fazla bot iş parçacığına ihtiyacımız yok. Bu aynı Reflexil tarafından yapılır.
    Ana kodu zaten biraz daha yukarıda tartıştık.
    Ve sonunda burada olması gerekeni iade ediyoruz. =)

    Yani - botun kendisi
    Enjekte etme işlevi:

    Public void Inject() ( AllocConsole(); Console.Title = "SHKBot"; Console.WriteLine("DLL загружена!"); Thread Th = new Thread(SHK); Th.Start(); BotForm FBot = new BotForm(); FBot.Show(); } … static extern bool AllocConsole(); !}

    İlk önce konsol penceresini açacak işlevi çağırıyoruz - bu, hata ayıklama için daha kolay olacaktır.
    Daha sonra akışı ana bot döngümüz olan SHK() ile başlatırız;
    Ve aynı zamanda kolaylık sağlamak için bot kontrol formunu açıyoruz.

    O zaman geriye kalan tek şey ihtiyacınız olan işlevselliği uygulamaktır.
    İşte kodumun geri kalanı - burada otomatik bir ticaret sistemi uyguladım.
    İşe yaraması için öncelikle her oturumda köyleri "önbelleğe almanız", yani ticaret yapacağınız köylerin her birini açmanız gerekir.
    Bu kodun faydası şüphelidir ve köyleri otomatik olarak yüklemenin başka yollarını henüz bulamadım:

    InterfaceMgr.Instance.selectVillage(VillageID); GameEngine.Instance.downloadCurrentVillage();

    İşte SHK işlev kodu:

    Gizli metin

    public void SHK() ( Console.WriteLine("Enjeksiyon tamamlandı!"); while (!GameEngine.Instance.World.isDownloadComplete()) ( Console.WriteLine("Dünya henüz indirilmedi!"); Thread.Sleep (5000) ; // 5 saniye Console.Clear(); ) Console.WriteLine("Dünya yüklendi! Çekirdek işlemleri başlatılıyor."); Console.WriteLine("\n======| HATA AYIKLAMA BİLGİSİ |= ==== ="); Console.WriteLine(RemoteServices.Instance.UserID); Console.WriteLine(RemoteServices.Instance.UserName); Liste VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); foreach (VillageIDs'de int VillageID) ( WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); Console.WriteLine("[Başlatma] " + Village.m_villageName + " - " + VillageID); InterfaceMgr.Instance.selectVillage (VillageID); GameEngine.Instance.downloadCurrentVillage(); ) Console.WriteLine("======| ========== |======\n"); while (true) ( ​​try ( // Buraya kendinize ait bir şey ekleyebilirsiniz ) catch (Exception ex) ( Console.WriteLine("\n======| EX INFO |======" ); Console .WriteLine(ex); Console.WriteLine("======| ======= |======\n"); ) ) )


    Kontrol formu kodu:

    Gizli metin

    Sistemi kullanarak; System.Collections.Generic'i kullanarak; System.ComponentModel'i kullanarak; System.Data'yı kullanarak; System.Drawing'i kullanarak; System.Text'i kullanarak; System.Windows.Forms'u kullanarak; System.Threading'i kullanarak; Krallıkları kullanma; System.CodeDom.Compiler'ı kullanarak; Microsoft.CSharp'ı kullanarak; System.Reflection'ı kullanarak; ad alanı BotDLL ( genel kısmi sınıf BotForm: Form ( Thread TradeThread; bool IsTrading = false; public void Log(string Text) ( Console.WriteLine(Text); richTextBox_Log.Text = Text + "\r\n" + richTextBox_Log.Text; ) public BotForm() ( CheckForIllegalCrossThreadCalls = false;InitializeComponent(); this.Show(); Log("Bot formu görüntülenir."); listBox_ResList.SelectedIndex = 0; Log("Ticaret konusunu başlat..."); TradeThread = new Thread(Trade); TradeThread.Start(); ) Private void Button_Trade_Click(object sender, EventArgs e) ( // Eğer dünya zaten yüklenmişse ve hedef alan doldurulmuşsa if (GameEngine.Instance.World.isDownloadComplete( ) && textBox_TradeTargetID.Text. Uzunluk > 0) ( try ( if (!IsTrading) // Eğer işlem yapmazsak ( Button_Trade.Text = "Stop"; IsTrading = true; // O zaman işlem yaparız) else // Ve tam tersi ( Button_Trade.Text = "Ticaret"; IsTrading = false; ) ) catch (Exception ex) ( Console.WriteLine("\n======| EX INFO |======); Log(ex) .ToString()); Console.WriteLine( "======| ======= |======\n"); ) ) ) public void Trade() ( Log("Ticaret akışı oluşturuldu!"); int Sleep = 0; while (true) // If ticaret ( Sleep = 60 + new Random().Next(-5, 60); if (IsTrading) ( Log("[" + DateTime.Now + "] \"" ile giriş + listBox_ResList.SelectedItem.ToString() + "\""); // Listeden ürün kimliğini alın int ResID = int.Parse(listBox_ResList.SelectedItem.ToString().Replace(" ", "").Split("-")); int TargetID = int.Parse(textBox_TradeTargetID.Text); // Hedef köy Listesinin kimliğini alın VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); // Köylerimizin listesini alıyoruz foreach (int VillageID'lerde VillageID'ler) // Bunların üzerinden geçiyoruz ( // Köy yüklenmişse (haritası mevcut oturumda en az bir kez açılmışsa) if (GameEngine.Instance.getVillage( VillageID) != null) ( // Köyümüz hakkında temel bilgileri alın WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); VillageMap Haritası = GameEngine.Instance.getVillage(VillageID); // ResAmount ile ilgili tüm bilgileri alın = (int)Map.getResourceLevel(ResID ); // Depodaki kaynak sayısı int MerchantsCount = Map.calcTotalTradersAtHome(); // İçindeki tüccar sayısı Log("Köyde " + MerchantsCount + " tüccar var " + VillageID + "); // Hata ayıklama int SendWithOne = int.Parse(textBox_ResCount.Text); // Tüccar başına kaynak sayısı int MaxAmount = MerchantsCount * SendWithOne; // Kaynak sayısı şu durumda gönderilecektir: (ResAmount)< MaxAmount) // Если торговцы могут увезти больше чем есть MerchantsCount = (int)(ResAmount / SendWithOne); // Считаем сколько смогут увезти реально if (MerchantsCount >0) // Evde tüccarlar varsa ( TargetID = GameEngine.Instance.World.getRegionCapitalVillage(Village.regionID); // Bölgeyle ticaret yapın, geçici olarak textBox_TradeTargetID.Text = TargetID.ToString(); // Yüksek bir çağrı yapın bir dizi geri çağırma ile seviye ticaret işlevi GameEngine.Instance.getVillage(VillageID).stockExchangeTrade(TargetID, ResID, MerchantsCount * SendWithOne, false); AllVillagesPanel.travellersChanged(); // GUI istemcisindeki değişiklikleri onaylayın (tüccarlar kaldı) ) ) ) Log("İşlem döngüsünü " + Sleep + " saniye boyunca " + DateTime.Now.AddSeconds(Sleep).ToString("HH:mm:ss") içinde tekrarlayın); Console.WriteLine(); ) Thread.Sleep(Uyku * 1000); // Spam yapmamak için uyuyoruz. Yani daha az açık kahverengi. )) ) Private void BotForm_FormClosing(object sender, FormClosingEventArgs e) ( try ( TradeThread.Abort(); ) catch() ) Private void Button_MapEditing_Click(object sender, EventArgs e) ( Button_MapEditing.Text = (!GameEngine.Instance.World.MapEditing) ).ToString(); GameEngine.Instance.World.MapEditing = !GameEngine.Instance.World.MapEditing; ) Private void Button_Exec_Click(object sender, EventArgs e) ( if (richTextBox_In.Text.Length == 0 || !GameEngine. Instance.World.isDownloadComplete()) return; richTextBox_Out.Text = ""; // *** Örnek form girişinin bir metin kutusunda kodu var string lcCode = richTextBox_In.Text; ICodeCompiler loCompiler = new CSharpCodeProvider().CreateCompiler(); CompilerParameters loParameters = new CompilerParameters(); // *** Başvurulan tüm derlemeleri ekleyerek başlayın loParameters.ReferencedAssemblies.Add("System.dll"); loParameters.ReferencedAssemblies.Add("System.Data.dll"); loParameters.ReferencedAssemblies .Add("System.Windows.Forms.dll"); loParameters.ReferencedAssemblies.Add("StrongholdKingdoms.exe"); // *** Dize olarak tamamen işlevsel bir derleme oluşturulmalıdır lcCode = @"System kullanarak; System.IO kullanarak; System.Windows.Forms kullanarak; System.Collections.Generic kullanarak; System.Text kullanarak; Kingdoms kullanarak; ad alanı NSpace ( public class NClass ( public object DynamicCode(params object Parameters) ( " + lcCode + @" return null; ) ) )"; // *** Ortaya çıkan derlemeyi belleğe yükleyin loParameters.GenerateInMemory = false; // *** Şimdi her şeyi derleyin CompilerResults loCompiled = loCompiler.CompileAssemblyFromSource(loParameters, lcCode); if (loCompiled.Errors.HasErrors) ( string lcErrorMsg = ""; lcErrorMsg = loCompiled.Errors.Count.ToString() + " Hatalar:"; for (int x = 0; x< loCompiled.Errors.Count; x++) lcErrorMsg = lcErrorMsg + "\r\nLine: " + loCompiled.Errors[x].Line.ToString() + " - " + loCompiled.Errors[x].ErrorText; richTextBox_Out.Text = lcErrorMsg + "\r\n\r\n" + lcCode; return; } Assembly loAssembly = loCompiled.CompiledAssembly; // *** Retrieve an obj ref – generic type only object loObject = loAssembly.CreateInstance("NSpace.NClass"); if (loObject == null) { richTextBox_Out.Text = "Couldn"t load class."; return; } object loCodeParms = new object; loCodeParms = "SHKBot"; try { object loResult = loObject.GetType().InvokeMember("DynamicCode", BindingFlags.InvokeMethod, null, loObject, loCodeParms); //DateTime ltNow = (DateTime)loResult; if (loResult != null) richTextBox_Out.Text = "Method Call Result:\r\n\r\n" + loResult.ToString(); } catch (Exception ex) { Console.WriteLine("\n======| EX INFO |======"); Console.WriteLine(ex); Console.WriteLine("======| ======= |======\n"); } } } }

    Başlangıçta bota NLua'yı (C# için Lua kütüphanesi) takmak istedim, ancak yalnızca 3.5+ çerçeveleri desteklediğinden ve bazı nedenlerden dolayı eski sürümleri kullanmak istemediğimden şunu yaptım:
    Kolaylık sağlamak için Sharp'ın kendisinde gerçek zamanlı kod yürütme özelliğini tanıttım - tekrar tekrar derlemelerden sonra oyunu yeniden başlatmaktan yoruldum.
    Onu kullandım.

    Sonuç olarak
    Bu çözümün avantajları:
    1. Kaynak kodunuz varmış gibi tüm oyun kodlarına erişin.
    2. Bir dizi bina, sınırsız araştırma ve çok daha fazlasıyla kendi premium harita sisteminizi oluşturabilirsiniz:
      • Çevrenizdeki bölgeler arasında mal satmaya yönelik algoritma.
      • Örnek olarak mevcut bir köyden alınan "modele dayalı" bir köyün otomatik inşası.
      • Çeşitli birimlerin otomatik olarak kiralanması.
      • Siz yokken kilidin otomatik onarımı.
      • Garantili bir kartın zaman içinde otomatik olarak tahsil edilmesi.
    3. Ve elbette dinamik kod yürütme.
    4. Gülünç tespit koruması. Şüpheli sahte istekler göndermemek için birkaç koşul daha var.
    Eksileri:
    1. İstemciyi her sürümde manuel olarak yamalamanız gerekecektir. Veya çerçevedeki Mono.Cecil veya eşdeğerini kullanarak bir yamalı yazabilirsiniz.
    2. Premium kartların aksine, müşterinizi her zaman açık ve çevrimiçi tutmanız gerekecek.
    3. Oyun oldukça büyük olduğundan API'yi incelemeniz kesinlikle bir saatinizi alacaktır. Bununla birlikte, eğer arzusu ve araçları olsaydı, yıllar içinde çok bilgili olurdu - eğer arzusu olsaydı. Ve her durumda paketlerle uğraşmaktan daha iyidir.

    Her şey şuna benziyor:

    Sınıfların listesi

    • Oyun Motoru
    • GameEngine.Instance
    • GameEngine.Instance.World
    • Dünya haritası
    • WorldMap.VillageData
    • UzaktanHizmetler
    • RemoteServices.Instance
    • TümKöylerPanel
    • Köy Haritası

    Bu yazı yazıldığı sırada oyunun sürümü 2.0.18.6 idi.
    Bu özel sürümü oyunun ve botun yürütülebilir dosyasıyla birlikte indirebilirsiniz.
    Merak etmeyin, kişisel bilgilerinizi çalmıyorum. =) Oyundan yoruldum bu yüzden deneyimlerimi toplulukla paylaşıyorum.

    Kaynak kodları mevcuttur.
    Kaynak kodları kullanacaksanız, sınıf kitaplığı olarak temiz bir yürütülebilir dosya kullanın (sizin tarafınızdan yamalı değil) ve ayrıca yamalı olanı yanlışlıkla değiştirmemek için bu bağlantının hedef dizine kopyalanmasını da devre dışı bırakın.
    oyun botu Etiket ekle

    Ödeme yapıldıktan hemen sonra, resmi tedarikçi Akella şirketinden Stronghold Kingdoms oyununun bulunduğu kutudan, 750 CZK değerinde bonuslar almak için oyunun kişisel hesabınıza girilmesi gereken lisans anahtarının dijital bir kopyasını alırsınız:
    Ayda 2 jeton
    10 Üretim Destesi
    10 Yemek Güvertesi
    5 Savunma Destesi (deste başına 10)
    4 Savaş Destesi (deste başına 10)
    30 Deste rastgele kart (deste başına 10)

    Başlangıç ​​Seti, Stronghold Kingdoms'da orta çağ hakimiyetine hızlı bir şekilde başlamak isteyen yeni oyuncular için idealdir. İster barışçıl bir şekilde çiftçilik yapmak, ister siyasi oyunlara katılmak veya yeminli düşmanlarınızdan intikam almak istiyor olun, bu başlangıç ​​seti size taca giden yolda güçlü bir destek sağlayacaktır.

    Baron, dük veya kral mı olmak istiyorsunuz? Kendinizi savaşan feodal beylerin dünyasına, ittifakların ve koca devletlerin yaratılıp yok edildiği bir dünyaya bırakın. Bir ortaçağ hükümdarının rolünü deneyin. Taht seni bekliyor, Egemen!

    Oyun özellikleri:
    - Gerçekçi bir ortaçağ dünyasında binlerce oyuncuya katılın.
    - Yüzyıllarca dayanacak muhteşem kaleler inşa edin!
    - Ordularınızı silahlandırın ve komşularınızın topraklarını fethedin!
    - Köylerinizin, kasabalarınızın ve kalelerinizin canlanmasını ve büyümesini izleyin.
    - Yüzlerce güvenilir teknolojiyi keşfedin.
    - Eski Rus haritasında oynayın!

    Bu kodun bölgesel kısıtlaması yoktur (Bölgesiz)
    Diller: Rusça, İngilizce
    Yayıncı: Akella

    Ek Bilgiler

    Stronghold Kingdoms oyunu ücretsizdir (Oynaması Ücretsizdir), Steam üzerinden indirebilirsiniz - http://store.steampowered.com/app/47410/

    750 kron karşılığında başlangıç ​​bonusu setini etkinleştirmek için basit talimatları uygulamanız gerekir:
    1. Oyunun resmi web sitesinde mevcut hesabınızda oturum açın veya yeni bir hesap kaydedin http://login.strongholdkingdoms.com/kingdoms/account.php
    2. Ödeme sonrasında alınan aktivasyon kodunu “Kodu etkinleştir” alanına girin, beliren onay butonuna tıklayın
    3. 750 kron değerindeki bonuslar zaten hesabınızda!

    Dikkat olmak! Bu kodu hesabınızda yalnızca bir kez etkinleştirebilirsiniz!

    Ayrıca benzer ürünlere de dikkat etmenizi öneririz:
    STRONGHOLD KINGDOMS - 350 TAÇ İÇİN BONUSLAR -

    Tarafımızca dağıtılan diğer oyunlarla da ilgilenebilirsiniz. Listenin tamamına linkten ulaşabilirsiniz:

    Yorumlar

    54

    Müşterilerden herhangi bir geri dönüş alınmadı.

    Satın alınan ürünün olumlu değerlendirilmesi için satıcı size 100 TL tutarında hediye çeki verecektir. 5,99 ruble .

    Telif hakkı ve mülkiyet haklarının ihlaline karşı koymak ve site yönetimine yönelik bu tür bir ihlalde suç ortaklığına ilişkin asılsız suçlamaları hariç tutmak için, Plati ticaret platformunun (http://www.site) yönetimi size şu adresten başvurmaktadır: talep - Plati ticaret platformunda ihlallerin tespit edilmesi durumunda, bu tür bir ihlalin durumu hakkında bizi derhal bilgilendirin ve bize telif hakkınızı veya mülkiyet haklarınızı doğrulayan güvenilir bilgiler sağlayın. Mektupta iletişim bilgilerinizi (tam ad, telefon numarası) belirttiğinizden emin olun.

    Bu hakların ihlaline ilişkin asılsız ve kasıtlı olarak yanlış raporları hariç tutmak için, yönetim, yalnızca telif hakkınızı veya mülkiyet haklarınızı doğrulayan belgelerin kopyalarıyla birlikte sizden yazılı ihlal beyanlarını aldıktan sonra Plati ticaret platformunda hizmet sunmayı reddedecektir. adres: 123007, Moskova, Maly Kaluzhsky şeridi. 4, bina 3, Avukatlık bürosu "AKAR No. 380".

    Haklarınızın ihlaline ve vicdansız satıcıların eylemlerinin engellenmesi ihtiyacına derhal yanıt verebilmek için Plati, sizden satıcının eylemlerinin engellenmesine temel olacak onaylı bir telgraf göndermenizi ister, bu telgrafta aşağıdakilerin belirtilmesi gerekir: : ihlal edilen hakların türü, haklarınızın teyidi ve iletişim bilgileriniz (kurumsal olarak - kişinin yasal şekli, tam adı). Telif hakkınızı veya mülkiyet haklarınızı teyit eden yazılı belgeleri Hukuk Bürosuna sunmamanız halinde, engelleme 15 gün sonra kaldırılacaktır.

    Firefly Studios, kale MMO'ları için yeni ve iddialı bir Rus dili dünyası yayınladı Kale Krallıkları. World 6 kapılarını 15 Haziran'da açtı ve binlerce oyuncu, en son güncellemeyle oyuna eklenen yeni mekaniklere sahip yeni oyun sunucusunu denemek için akın etti. Yeni dünya hem yeni oyunculara hem de eski oyunculara açık Krallıklar. Rusya'nın batı kısmının yanı sıra Baltık ülkeleri, Ukrayna, Belarus, Kazakistan ve diğer devletler de dahil olmak üzere çevredeki bölgeler ve ülkelerin coğrafi haritasına dayanmaktadır.

    Oyuncular, kendi kurallarına ve özelliklerine sahip güçlü Hanelerde birleşerek bu bölgelerin kontrolü için savaşabilirler. Bu dünya, dinin kullanımını sınırlayan ve yeni başlayanlara daha fazla fırsat sunan güncellenmiş oyun mekanikleriyle öncekilerden farklı. Burası Stronghold Kingdoms'ta yeni kuralların kullanıldığı ikinci dünya ve bu kuralların oluşturulduğu ilk "yerel" dünyadır.

    Rusça konuşanların yanı sıra, Krallıklar Ayrıca İngiliz, Alman, Fransız, İspanyol dünyaları ve küresel haritaya dayalı dünyalar da var. Şu anda, yeni dünyaya katılan tüm oyuncular, hesaplarına bir dizi oyun içi öğe ekleyecek ve bu sayede oyuncuların yeni dünyadaki gelişimlerini önemli ölçüde hızlandırabilecekleri ve krallıklarında düzen kurabilecekleri özel bir promosyon kodunu etkinleştirebilirler. .

    Kod: D1F9-33BA-0C7F-BAF5

    Bu promosyon kodu oyunda kayıt sürecinden geçerek etkinleştirilebilir. 1 Temmuz'a kadar geçerli olacak ve hesap başına yalnızca bir kez kullanılabilir.