Betreten
Alle Computergeheimnisse für Anfänger und Profis
  • Für einen unerfahrenen Benutzer: Unterschiede zwischen Softwareprodukten des 1C:Enterprise-Programmsystems
  • Programm 1s 8.3 Demoversion. Mobile Anwendung „UNF“ NEU
  • Aufbau des 1C-Managements unseres Unternehmens von Grund auf
  • Kostenlose Warface-Registrierung
  • Registrierung im Spiel World Of Tanks – was müssen Sie wissen?
  • Strategie und Taktik von Starcraft II
  • Einen Bot für Stronghold Kingdoms schreiben. Einen Bot für Stronghold Kingdoms schreiben. Arbeitscodes für das Spiel Stronghold Kingdoms

    Einen Bot für Stronghold Kingdoms schreiben.  Einen Bot für Stronghold Kingdoms schreiben. Arbeitscodes für das Spiel Stronghold Kingdoms

    Möchten Sie für ein echtes Abenteuer in eine andere Zeit versetzt werden? Führen Sie ein kostenloses Online-Spiel auf Ihrem Computer aus „Festungskönigreiche“ und versuchen Sie sich an brutalen mittelalterlichen Kriegen. Spüren Sie, wie das Blut in Ihren Adern kalt wird, und finden Sie heraus, wie viel Adrenalin Sie haben. Der Effekt eines tiefen Eintauchens in das Spiel ist garantiert. Stronghold Kingdoms September-Oktober 2019 – fühlen Sie sich wie ein echter Held!

    Die Spieler finden sich in einer mittelalterlichen Welt voller Gefahren wieder, an die sie sich gewöhnen und einleben müssen, vom Bau eines Hauses über die Verteidigung einer Festung bis hin zur Teilnahme an einem Krieg.

    Spielfunktionen:

    • Spieler bauen und erweitern mittelalterliche Festungen, die die Zeit überdauern werden;
    • Die Teilnehmer verwalten Dörfer und platzieren Gebäude darin richtig, um die Effizienz zu steigern.
    • Mit Hilfe einer Sammelkarte können Spieler handeln, erkunden, auskundschaften usw.;
    • den Weg zu hohen Titeln gehen, um Macht zu erlangen;
    • Erstellen und spielen Sie Ihre strategischen Karten, um sich einen entscheidenden Vorteil zu verschaffen.

    Die Spannung in diesem Spiel wird himmelhohe Ausmaße erreichen und der Sieg lässt Sie echte Euphorie verspüren. Die Macher entwickeln regelmäßig neue Versionen des Spiels. Mit jedem Update kommt etwas Neues hinzu, die Möglichkeiten werden erweitert und das Spiel wird noch bunter, vielfältiger und interessanter.

    Wie löse ich einen Gutschein für das Spiel Stronghold Kingdoms September-Oktober 2019 ein?

    Um das begehrte „Geheimwort“ zu erhalten, wählen Sie einfach einen der Artikel auf unserer Website aus, für die der Rabatt gilt, und klicken Sie mit der Maus. Das System vergibt dann automatisch eine eindeutige symbolische Nummer. Jeder kann einen Aktionscode für das Stronghold Kingdoms-Spiel anwenden: Kopieren Sie die erhaltene Nummer, folgen Sie dem Link und fügen Sie die Kombination aus Buchstaben und Zahlen in das spezielle Feld ein, wenn Sie sich für kostenpflichtige Dienste registrieren. Rabattgutscheine sind nur begrenzte Zeit gültig, achten Sie daher immer auf den Zeitpunkt der Aktion. Rabatte auf Gutscheine sind in der Regel nicht mit Rabatten auf kostenpflichtige Konten und andere mit „Sonderangebot“ gekennzeichnete Glücksspieldienste kombinierbar.

    Das Spiel wird kostenlos vertrieben, indem der Spiel-Client von der offiziellen Website der Firefly Studios heruntergeladen wird.

    Bitte warten, Aktionscodes werden geladen

    Aktuelle Stronghold Kingdoms-Bonuscodes und Aktionscodes sind auf unserer Website direkt auf dieser Seite erschienen. Stronghold Kingdoms ist die neueste Browserstrategie der Macher des beliebten Spiels Stronghold.

    Das Spiel ist ideal für Fans, die den Client nicht auf ihren Computer herunterladen möchten. Alle Fans der alten Version des Spiels werden das Gameplay genießen, da Sie sich jetzt im Online-Modus befinden. Jetzt sind Ihre Feinde Menschen, keine Bots. Sie müssen Ihre strategischen und wirtschaftlichen Fähigkeiten unter Beweis stellen, damit Ihre Stadt nicht zerstört wird. Für Leute, die zum ersten Mal von dem Spiel gehört haben, gibt es ein paar Dinge, die Sie wissen müssen. Erstens findet man sich sofort im Mittelalter wieder, während der Kreuzzüge und verschiedener historischer Ereignisse. Sie müssen Ihre Stadt bauen, sie mit einer hohen Mauer umzäunen, ein System für Nahrung und Unterhaltung einrichten und natürlich Ihre eigene Armee bilden. Das Spiel vereint viele verschiedene Spiele, da Sie die Stimmung der Bevölkerung und die Entwicklung der Stadt überwachen müssen, während Sie am anderen Ende der Karte die Schlachten verwalten. Es gibt viele Rassen und Truppenkategorien. Von mächtigen Rittern bis hin zu gewöhnlichen Räubern. Es liegt an Ihnen, zu entscheiden, wie Sie Ihre Spielrichtlinien umsetzen. Aber das Spiel wird auf jeden Fall Spuren in Ihrer Erinnerung hinterlassen, denn mit einem solchen Entwicklungssystem gibt es praktisch nichts, das so einprägsam und lebendig ist. Alle Ereignisse finden in Echtzeit statt, daher müssen Entscheidungen schnell und wohlüberlegt getroffen werden.
    Wir bieten Aktionscodes für das Spiel Stronghold Kingdoms an, mit denen Sie große Rabatte und Boni erhalten. Dank ihnen können Sie eine große Armee anheuern und die nächstgelegenen Spielersiedlungen erobern oder eine Stadt entwickeln, die es verdient, als Hauptstadt der Karte bezeichnet zu werden. Die Werbeaktionen für dieses Spiel werden auf unserer Website ständig aktualisiert. Bleiben Sie über alle Ereignisse auf dem Laufenden.

    Was Benutzer am Spiel Stronghold Kingdoms reizt:

    • Die Möglichkeit, mit vielen Spielern aus der ganzen Welt zu interagieren: Handel, Schlachten, Eroberung von Burgen, Spionage und vieles mehr;
    • Es besteht die Möglichkeit, Disziplinen zu studieren und weiterzuentwickeln. (Zum Beispiel: Landwirtschaft, Industrie, Handel, Militärangelegenheiten);
    • Weltkarte der Provinzen, auf der alles in Regionen (Bezirke) unterteilt ist. Jedes dieser Gebiete wird für den Spieler eine Art Heimat sein;
    • Spiel gegen Live-Spieler und Computergegner (Banditenlager, Wolfshöhle, feindliches Belagerungslager und Burgen der Ratte, der Schlange, des Ebers und des Wolfs). Die KI kann das Eigentum des Spielers plündern, es lohnt sich also, auf den Schutz zu achten!
    Ich habe lange an die Frage herangegangen, einen Bot für dieses Spiel zu schreiben, aber entweder fehlte mir die Erfahrung, ich war faul oder ich habe versucht, aus der falschen Richtung an die Sache heranzugehen.
    Nachdem ich Erfahrung im Schreiben und Reverse Engineering von Code in C# gesammelt hatte, beschloss ich, mein Ziel zu erreichen.

    Ja, wie Sie vielleicht bemerkt haben, ist C# nicht einfach – das Spiel ist darin geschrieben und verwendet .net 2.0, was mir später einige Probleme bereitete.

    Ursprünglich dachte ich daran, einen Socket-Bot zu schreiben, der nur ein Netzwerkprotokoll emuliert (das in keiner Weise verschlüsselt ist) und dessen „Quellcodes“ (das Ergebnis der Dekompilierung des Il-Codes) in einem dritten Schritt problemlos wiederhergestellt werden können -Party-Antrag.

    Aber es kam mir mühsam und trostlos vor, denn warum sollte man sich mit einem Fahrrad beschäftigen, wenn man genau diese „Quellcodes“ hat?

    Mit Reflector bewaffnet begann ich, den Einstiegspunkt des Spiels herauszufinden (dessen Code seit mehr als drei Jahren überhaupt nicht verschleiert wurde, ich bin über die Entwickler erstaunt) – nichts Besonderes.

    Analyse und teilweise falsche Entscheidung
    Offensichtlich wurde das Spielprojekt ursprünglich als Konsolenanwendung erstellt:

    Private static void Main(string args) als Einstiegspunkt und seine Programmklasse deuten darauf hin; die Klasse ist übrigens auch privat.

    Zunächst beeilte ich mich, die Klasse und Methode öffentlich zu machen, wobei ich erneut Reflector mit dem Reflexil-Zusatz verwendete, ohne zu wissen, was mich erwarten würde.

    Doch plötzlich stieß ich auf einen Launcher, der eine geänderte Datei herunterlud.
    Nachdem ich kurz mit demselben Reflector damit gekämpft und eine Autopsie durchgeführt hatte, holte ich den Code zum Festlegen der Argumente heraus, die an die ausführbare Datei des Spiels übergeben wurden:

    If (DDText.getText(0x17) == "XX") Parameter = neuer String ( "-InstallerVersion", "", "", "st" ); // st == Steam else Parameter = neuer String ( "-InstallerVersion", "", "" ); Parameter = SelfUpdater.CurrentBuildVersion.ToString(); Parameter = DDText.getText(0); // Nachdem ich herumgestöbert habe, habe ich herausgefunden, dass dies die Sprache des Spiels ist, im Format „ru“, „de“, „en“ usw. Wird aus der Datei local.txt neben dem Launcher geladen. UpdateManager.SetCommandLineParameters(parameters); // Und dies ist ihr Wrapper für das häufigste System.Diagnostics.Process UpdateManager.StartApplication();

    Schauen wir uns Folgendes an:

    If (DDText.getText(0x17) == „XX“) – Eine Zeile aus der Datei local.txt neben dem Launcher.
    Sie haben so eine seltsame Prüfung für Steam-/No-Steam-Versionen: X – kein Steam, XX – Steam. :\
    Parameter = SelfUpdater.CurrentBuildVersion - Launcher-Version, springt ruhig davon, obwohl die Überprüfung im Client seltsam ist, wie ich später herausfand, und man einfach eine viel größere Zahl als die aktuelle angeben kann, „in Reserve“, weil Die Überprüfung erfolgt sozusagen nur auf Veraltung einer Version durch einen Zahlenvergleich „kleiner als größer“.
    Parameter = DDText.getText(0) – Nachdem ich die Version gefälscht hatte, fand ich heraus, dass dies die Sprache des Spiels ist, im Format „ru“, „de“, „en“ usw.
    Es wird auch aus der Datei local.txt geladen.

    Die Launcher-Version sieht übrigens ungefähr so ​​aus:

    Statischer SelfUpdater() ( currentBuildVersion = 0x75; // 117, also tatsächlich 1,17. )

    Und ich habe eine magische Batch-Datei erstellt:

    StrongholdKingdoms.exe -InstallerVersion 117 de

    Obwohl Sie dies tun können:

    StrongholdKingdoms.exe -InstallerVersion 100500 ru

    Darüber habe ich etwas weiter oben gesprochen.

    Was wir also haben: ein leicht modifizierter Client und ein Launcher-Bypass-System, wenn man es so nennen kann.
    Nachdem ich versucht habe, das alles auszuführen, sehe ich, dass das Spiel funktioniert und meine Patches ihm nicht geschadet haben (aber warum sollten sie ihm schaden?).

    Danach habe ich versucht, die ausführbare Datei des Spiels als Klassenbibliothek mit dem Projekt zu verbinden und den Namensraum des Spiels – Kingdoms – zu verbinden.

    Dann habe ich viel Code eingegrenzt: Ich habe versucht, Main aufzurufen und die Programm-Klasse zu emulieren, aber aus irgendeinem Grund stürzte das Spiel mit einem Laufzeitabsturz des Not-Dotnet-Frameworks ab, wann immer ich versuchte, es zum Laufen zu bringen.
    Er verwies auf die Tatsache, dass das Spiel viele Nicht-C#-Bibliotheken und viel unsicheren Code verwendet. Ich habe keine wirklichen Gründe gefunden.

    Die Entscheidung ist richtig
    Nachdem ich lange gelitten hatte und keine Lösung gefunden hatte, gab ich auf. Aber aus irgendeinem Grund erinnerte ich mich an den Fork des Terraria-Servers – TShock (ja, natürlich ein Fork – die Jungs hatten auch Spaß mit dem Dekompiler) und dessen Laden von Modulen (Mods/Plugins) aus DLLs.

    Ich fand diese Idee interessant. Nach dem Googeln habe ich sowohl eine Methode als auch einen Code gefunden.
    Nachdem ich mich ein wenig damit beschäftigt und es in meinem eigenen Projekt getestet hatte, stellte ich mit Entsetzen fest, dass es (plötzlich!) funktionierte.
    Eigentlich der Code:

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

    Schauen wir uns den Code an:
    System.Reflection.Assembly – Dies ist die Sache, die für die Erstellung von Links zu Dateien verantwortlich ist, wenn diese mit einem Projekt verbunden werden, nur aus Code. Es speichert auch Informationen über Ihre Projektversionen und Urheberrechte (ja, die gleichen AssemblyInfo.cs in allen Ihren Projekten).
    Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll") – Laden Sie unsere Bibliothek.
    Dann rufen wir die Funktion innerhalb dieser Klasse Inject() auf, was im Wesentlichen der Anfang des Bots ist. =)
    Ich habe den von mir skizzierten Code in einer Drittanbieteranwendung ausprobiert – die Injektion hat funktioniert.

    Patchen des Clients
    Kommen wir nun zum spaßigen Teil – der Implementierung des Challenge-Codes in das Spiel.
    Nachdem er dreist versucht hatte, es in Main einzuschleusen, indem er den Code mit Reflexil ersetzte, wurde er erfolgreich geschickt, um das zu patchen, was aufgrund der Dekompilierung nicht patchbar war. Oder vielleicht war ich einfach nur faul, das spielt keine Rolle.
    Ich habe genau in diesem Main nach einem garantierten Aufruf von Funktionen von Drittanbietern gesucht (außerhalb der Haupt-IF-Zweige usw.) und ziemlich schnell einen Aufruf der Funktion MySettings.load() gefunden, die beim Start die Spieleinstellungen geladen hat.
    Aber es stellte sich erneut heraus, dass es einen Berg an Code gab, der nicht ohne Diamanten kompiliert werden konnte.
    Aber zum Glück gibt es daneben eine boolesche Funktion hasLoggedIn(), die genau zu Beginn des Spiels einen einzelnen boolschen Wert zurückgibt:
    return (this.HasLoggedIn || (this.Username.Length > 0));
    Das hat mir sofort gefallen und diese Funktion wurde sofort in diese umgewandelt:

    If (!IsStarted) ( System.Reflection.Assembly A = System.Reflection.Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll"); Type ClassType = A.GetType("BotDLL. 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));

    Kümmern wir uns um ihn.
    if (!IsStarted) – wir mussten diese Prüfung hinzufügen und dazu ein zusätzliches Feld in die MySettings-Klasse einführen, da unsere Funktion mehr als einmal aufgerufen wird und wir nicht wirklich mehrere Bot-Threads benötigen. Dies geschieht durch das gleiche Reflexil.
    Nun, wir haben den Hauptcode bereits etwas weiter oben besprochen.
    Und am Ende geben wir zurück, was hier sein sollte. =)

    Also – der Bot selbst
    Injektionsfunktion:

    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(); !}

    Zuerst rufen wir die Funktion auf, um das Konsolenfenster zu öffnen – das erleichtert das Debuggen.
    Dann beginnen wir den Ablauf mit unserer Haupt-Bot-Schleife – SHK();
    Und gleichzeitig öffnen wir der Einfachheit halber das Bot-Kontrollformular.

    Dann müssen Sie nur noch die benötigte Funktionalität implementieren.
    Hier ist der Rest meines Codes – hier habe ich ein automatisches Handelssystem implementiert.
    Damit es funktioniert, müssen Sie zunächst die Dörfer in jeder Sitzung „zwischenspeichern“ – öffnen Sie also jedes der Dörfer, mit denen Sie handeln möchten.
    Dieser Code ist zweifelhaft hilfreich und ich habe noch keine anderen Möglichkeiten gefunden, Dörfer automatisch zu laden:

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

    Hier ist der SHK-Funktionscode:

    Versteckter Text

    public void SHK() ( Console.WriteLine("Injektion abgeschlossen!"); while (!GameEngine.Instance.World.isDownloadComplete()) ( Console.WriteLine("Die Welt wurde noch nicht heruntergeladen!"); Thread.Sleep (5000) ; // 5 Sek. Console.Clear(); ) Console.WriteLine("Die Welt ist geladen! Kerneloperationen werden gestartet."); Console.WriteLine("\n======| DEBUG INFO |= ==== ="); Console.WriteLine(RemoteServices.Instance.UserID); Console.WriteLine(RemoteServices.Instance.UserName); Liste VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); foreach (int VillageID in VillageIDs) ( WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); Console.WriteLine("[Initialization] " + Village.m_villageName + " - " + VillageID); InterfaceMgr.Instance.selectVillage (VillageID); GameEngine.Instance.downloadCurrentVillage(); ) Console.WriteLine("======| ========== |======\n"); while (true) ( ​​​​try ( // Sie können hier etwas Eigenes einfügen) Catch (Exception ex) ( Console.WriteLine("\n======| EX INFO |======" ); Console .WriteLine(ex); Console.WriteLine("======| ======= |======\n"); ) ) )


    Code des Kontrollformulars:

    Versteckter Text

    Verwenden des Systems; mit System.Collections.Generic; mit System.ComponentModel; Verwenden von System.Data; Verwenden von System.Drawing; Verwenden von System.Text; Verwenden von System.Windows.Forms; Verwenden von System.Threading; Verwendung von Königreichen; mit System.CodeDom.Compiler; mit Microsoft.CSharp; Verwenden von System.Reflection; Namespace BotDLL ( öffentliche Teilklasse 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("Das Bot-Formular wird angezeigt."); listBox_ResList.SelectedIndex = 0; Log("Trading-Thread starten..."); TradeThread = new Thread(Trade); TradeThread.Start(); ) private void button_Trade_Click(object sender, EventArgs e) ( // Wenn die Welt bereits geladen ist und das Zielfeld gefüllt ist if (GameEngine.Instance.World.isDownloadComplete( ) && textBox_TradeTargetID.Text. Länge > 0) ( try ( if (!IsTrading) // Wenn wir nicht handeln ( button_Trade.Text = "Stop"; IsTrading = true; // Dann handeln wir ) else // Und umgekehrt ( button_Trade.Text = "Trade"; IsTrading = false; ) ) Catch (Exception ex) ( Console.WriteLine("\n======| EX INFO |======"); Log(ex .ToString()); Console.WriteLine( "======| ======= |======\n"); ) ) ) public void Trade() ( Log("Handelsfluss erstellt!"); int Sleep = 0; while (true) // If Trading ( Sleep = 60 + new Random().Next(-5, 60); if (IsTrading) ( Log("[" + DateTime.Now + "] Eingeben mit \"" + listBox_ResList.SelectedItem.ToString() + "\""); // Holen Sie sich die Produkt-ID aus der Liste int ResID = int.Parse(listBox_ResList.SelectedItem.ToString().Replace(" ", "").Split("-")); int TargetID = int. Parse(textBox_TradeTargetID.Text); // Holen Sie sich die ID der Zieldorfliste VillageIDs = GameEngine.Instance.World.getListOfUserVillages(); // Eine Liste unserer Dörfer abrufen foreach (int VillageID in VillageIDs) // Wir gehen sie durch ( // Wenn das Dorf geladen ist (seine Karte wurde in der aktuellen Sitzung mindestens einmal geöffnet) if (GameEngine.Instance.getVillage( VillageID) != null) ( // Grundlegende Informationen über unser Dorf erhalten WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); VillageMap Map = GameEngine.Instance.getVillage(VillageID); // Vollständige Informationen erhalten int ResAmount = (int)Map.getResourceLevel(ResID ); // Anzahl der Ressourcen im Lager int MerchantsCount = Map.calcTotalTradersAtHome(); // Anzahl der darin enthaltenen Händler Log("Es gibt " + MerchantsCount + " Händler im Dorf " + VillageID + "); // Debug int SendWithOne = int.Parse(textBox_ResCount.Text); // Anzahl der Ressourcen pro Händler int MaxAmount = MerchantsCount * SendWithOne; // Anzahl der Ressourcen wird gesendet, wenn (ResAmount< MaxAmount) // Если торговцы могут увезти больше чем есть MerchantsCount = (int)(ResAmount / SendWithOne); // Считаем сколько смогут увезти реально if (MerchantsCount >0) // Wenn es Händler zu Hause gibt ( TargetID = GameEngine.Instance.World.getRegionCapitalVillage(Village.regionID); // Handel mit der Region, vorübergehend textBox_TradeTargetID.Text = TargetID.ToString(); // Aufruf eines High- Level-Handelsfunktion mit einer Reihe von Rückrufen GameEngine.Instance.getVillage(VillageID).stockExchangeTrade(TargetID, ResID, MerchantsCount * SendWithOne, false); AllVillagesPanel.travellersChanged(); // Bestätigen Sie die Änderungen (Händler sind gegangen) im GUI-Client ) ) ) Log("Wiederholen Sie den Handelszyklus über " + Sleep + " Sekunden in " + DateTime.Now.AddSeconds(Sleep).ToString("HH:mm:ss")); Console.WriteLine(); ) Thread.Sleep(Sleep * 1000); // Wir schlafen, um keinen Spam zu versenden. Also weniger Rehkitz. ) ) 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 = ""; // *** Beispielformulareingabe enthält Code in einem Textfeld string lcCode = richTextBox_In.Text; ICodeCompiler loCompiler = new CSharpCodeProvider().CreateCompiler(); CompilerParameters loParameters = new CompilerParameters(); // *** Beginnen Sie mit dem Hinzufügen aller referenzierten Assemblys loParameters.ReferencedAssemblies.Add("System.dll"); loParameters.ReferencedAssemblies.Add("System.Data.dll"); loParameters.ReferencedAssemblies .Add("System.Windows.Forms.dll"); loParameters.ReferencedAssemblies.Add("StrongholdKingdoms.exe"); // *** Muss eine voll funktionsfähige Assembly als Zeichenfolge erstellen lcCode = @"using System; using System.IO; using System.Windows.Forms; using System.Collections.Generic; using System.Text; using Kingdoms; namespace NSpace ( öffentliche Klasse NClass ( öffentliches Objekt DynamicCode(params Objektparameter) ( " + lcCode + @" return null; ) ) )"; // *** Die resultierende Assembly in den Speicher laden loParameters.GenerateInMemory = false; // *** Jetzt das Ganze kompilieren CompilerResults loCompiled = loCompiler.CompileAssemblyFromSource(loParameters, lcCode); if (loCompiled.Errors.HasErrors) ( string lcErrorMsg = ""; lcErrorMsg = loCompiled.Errors.Count.ToString() + " Errors:"; 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"); } } } }

    Ursprünglich wollte ich NLua (Lua-Bibliothek für C#) in den Bot einbinden, aber da dieser nur Frameworks ab 3.5 unterstützt und ich aus irgendeinem Grund keine älteren Versionen verwenden wollte, habe ich Folgendes getan:
    Der Einfachheit halber habe ich die Codeausführung in Echtzeit auf dem Sharp selbst eingeführt – ich hatte es satt, das Spiel nach immer wieder neu kompilierten Neukompilierungen neu zu starten.
    Ich benutzte es.

    Endeffekt
    Die Vorteile dieser Lösung:
    1. Greifen Sie auf den gesamten Spielcode zu, als ob Sie den Quellcode hätten.
    2. Sie können Ihr eigenes Premium-Kartensystem mit einer Reihe von Gebäuden, unbegrenzter Forschung und noch mehr erstellen:
      • Algorithmus für den Weiterverkauf von Waren in den Regionen um Sie herum.
      • Automatischer Bau eines Dorfes „nach einem Modell“ am Beispiel eines bestehenden Dorfes.
      • Autovermietung verschiedener Einheiten.
      • Automatische Reparatur des Schlosses während Ihrer Abwesenheit.
      • Automatischer Einzug einer garantierten Karte im Laufe der Zeit.
    3. Und natürlich dynamische Codeausführung.
    4. Lächerlicher Erkennungsschutz. Nun, noch ein paar Bedingungen, um keine verdächtigen Dummy-Anfragen zu senden.
    Nachteile:
    1. Sie müssen den Client für jede Version manuell patchen. Oder Sie können einen Patcher mit Mono.Cecil oder einem Äquivalent im Framework schreiben.
    2. Im Gegensatz zu Premium-Karten müssen Sie dafür sorgen, dass der Kunde immer online bleibt.
    3. Das Spiel ist ziemlich umfangreich, sodass Sie auf jeden Fall eine Stunde brauchen werden, um die API zu studieren. Wenn er jedoch den Wunsch und die Werkzeuge hätte, wäre er in Jahren gut bewandert – wenn er den Wunsch hätte. Und auf jeden Fall ist es besser, als mit Paketen herumzuspielen.

    So sieht das Ganze aus:

    Liste der Klassen

    • GameEngine
    • GameEngine.Instance
    • GameEngine.Instance.World
    • Weltkarte
    • WorldMap.VillageData
    • RemoteServices
    • RemoteServices.Instance
    • AllVillagesPanel
    • Dorfkarte

    Zum Zeitpunkt des Schreibens war die Spielversion 2.0.18.6.
    Sie können diese spezielle Version mit der ausführbaren Datei des Spiels und des Bots herunterladen.
    Keine Sorge, ich stehle keine persönlichen Daten. =) Ich habe das Spiel satt, deshalb teile ich meine Erfahrungen mit der Community.

    Quellcodes sind verfügbar.
    Wenn Sie die Quellcodes verwenden möchten, verwenden Sie eine saubere ausführbare Datei (nicht von Ihnen gepatcht) als Klassenbibliothek und deaktivieren Sie außerdem das Kopieren dieses Links in das Zielverzeichnis, um nicht versehentlich die gepatchte Datei zu ersetzen.
    Game Bot Tags hinzufügen

    Unmittelbar nach der Zahlung erhalten Sie vom offiziellen Anbieter – der Firma Akella – eine digitale Kopie des Lizenzschlüssels aus der Box mit dem Spiel Stronghold Kingdoms, die in Ihrem persönlichen Konto des Spiels eingegeben werden muss, um Boni im Wert von 750 CZK zu erhalten:
    2 Token pro Monat
    10 Produktionsdecks
    10 Food-Decks
    5 Verteidigungsdecks (10 pro Deck)
    4 Kriegsdecks (10 pro Deck)
    30 Decks mit zufälligen Karten (10 pro Deck)

    Das Starter-Set ist ideal für neue Spieler, die schnell mit der mittelalterlichen Herrschaft in Stronghold Kingdoms beginnen möchten. Egal, ob Sie friedlich Landwirtschaft betreiben, sich auf politische Spiele einlassen oder sich an Ihren Erzfeinden rächen möchten, dieses Starterset gibt Ihnen einen kräftigen Schub auf Ihrem Weg zur Krone.

    Möchten Sie Baron, Herzog oder König werden? Tauchen Sie ein in die Welt der verfeindeten Feudalherren, in eine Welt, in der Allianzen und ganze Staaten geschaffen und zerstört werden. Schlüpfen Sie in die Rolle eines mittelalterlichen Herrschers. Der Thron erwartet dich, Souverän!

    Spielfunktionen:
    - Treten Sie Tausenden von Spielern in einer realistischen mittelalterlichen Welt bei.
    - Bauen Sie großartige Festungen, die Jahrhunderte überdauern!
    - Bewaffnen Sie Ihre Armeen und erobern Sie das Land Ihrer Nachbarn!
    - Beobachten Sie, wie Ihre Dörfer, Städte und Burgen zum Leben erwachen und wachsen.
    - Entdecken Sie Hunderte vertrauenswürdiger Technologien.
    - Spielen Sie auf der Karte des antiken Russlands!

    Dieser Code hat keine territorialen Beschränkungen (Region Free)
    Sprachen: Russisch, Englisch
    Herausgeber: Akella

    Weitere Informationen

    Das Spiel Stronghold Kingdoms ist kostenlos (Free to Play), Sie können es über Steam herunterladen – http://store.steampowered.com/app/47410/

    Um das Starter-Boni-Set für 750 Kronen zu aktivieren, müssen Sie die einfachen Anweisungen befolgen:
    1. Melden Sie sich bei Ihrem bestehenden Konto an oder registrieren Sie ein neues auf der offiziellen Website des Spiels http://login.strongholdkingdoms.com/kingdoms/account.php
    2. Geben Sie den nach der Zahlung erhaltenen Aktivierungscode in das Feld „Aktivierungscode“ ein und klicken Sie auf die angezeigte Bestätigungsschaltfläche
    3. Boni im Wert von 750 Kronen sind bereits auf Ihrem Konto!

    Seien Sie aufmerksam! Sie können diesen Code nur einmal in Ihrem Konto aktivieren!

    Wir empfehlen Ihnen auch, auf ähnliche Produkte zu achten:
    STRONGHOLD KINGDOMS – BONI FÜR 350 KRONEN –

    Möglicherweise interessieren Sie sich auch für andere von uns vertriebene Spiele. Die vollständige Liste finden Sie unter folgendem Link:

    Rezensionen

    54

    Keine Rückmeldung von Kunden erhalten.

    Für eine positive Bewertung des gekauften Produkts stellt Ihnen der Verkäufer einen Geschenkgutschein im Wert von zur Verfügung 5,99 RUB .

    Um der Verletzung von Urheber- und Eigentumsrechten entgegenzuwirken und unbegründete Vorwürfe gegen die Site-Administration wegen Mitschuld an einer solchen Verletzung auszuschließen, appelliert die Administration der Plati-Handelsplattform (http://www.site) an Sie mit eine Anfrage – im Falle der Feststellung von Verstößen auf der Handelsplattform Plati informieren Sie uns unverzüglich an der Adresse über die Tatsache eines solchen Verstoßes und stellen Sie uns zuverlässige Informationen zur Verfügung, die Ihre Urheber- oder Eigentumsrechte bestätigen. Geben Sie im Brief unbedingt Ihre Kontaktdaten (vollständiger Name, Telefonnummer) an.

    Um unbegründete und vorsätzlich falsche Meldungen über Verletzungen dieser Rechte auszuschließen, wird die Verwaltung die Erbringung von Dienstleistungen auf der Plati-Handelsplattform nur dann verweigern, wenn Sie von Ihnen schriftliche Erklärungen über die Verletzung zusammen mit Kopien von Dokumenten erhalten haben, die Ihre Urheber- oder Eigentumsrechte bestätigen Adresse: 123007, Moskau, Maly Kaluzhsky Gasse. 4, Gebäude 3, Anwaltskanzlei „AKAR Nr. 380“.

    Um rechtzeitig auf Verletzungen Ihrer Rechte und die Notwendigkeit, die Handlungen skrupelloser Verkäufer zu blockieren, reagieren zu können, bittet Plati Sie, ein beglaubigtes Telegramm zu senden, das als Grundlage für die Blockierung der Handlungen des Verkäufers dient. Dieses Telegramm muss einen Hinweis darauf enthalten : die Art der verletzten Rechte, Bestätigung Ihrer Rechte und Ihre Kontaktdaten (organisatorisch – Rechtsform der Person, vollständiger Name). Die Sperrung wird nach 15 Tagen aufgehoben, wenn Sie der Anwaltskanzlei keine schriftlichen Dokumente zur Bestätigung Ihrer Urheber- oder Eigentumsrechte vorlegen.

    Firefly Studios haben für ihr Burg-MMO eine ambitionierte neue russischsprachige Welt veröffentlicht Festungskönigreiche. World 6 öffnete am 15. Juni seine Pforten und Tausende von Spielern strömten herbei, um den frischen Spielserver mit den neuen Mechaniken auszuprobieren, die im neuesten Update in das Spiel eingeführt wurden. Die neue Welt steht sowohl neuen Spielern als auch Veteranen zur Verfügung Königreiche. Es basiert auf einer geografischen Karte des westlichen Teils Russlands sowie der umliegenden Regionen und Länder, darunter die baltischen Staaten, die Ukraine, Weißrussland, Kasachstan und andere Staaten.

    Spieler können um die Kontrolle über diese Gebiete kämpfen und sich zu mächtigen Häusern mit eigenen Regeln und Eigenschaften zusammenschließen. Diese Welt unterscheidet sich von früheren durch aktualisierte Spielmechaniken, die den Einsatz von Religion einschränken und Anfängern mehr Möglichkeiten bieten. Dies ist die zweite Welt in Stronghold Kingdoms, die die neuen Regeln anwendet, und die erste „lokale“ Welt, in der diese Regeln eingeführt wurden.

    Neben Russischsprachigen Königreiche Es gibt auch britische, deutsche, französische, spanische Welten und Welten, die auf einer globalen Karte basieren. Ab sofort können alle Spieler, die der neuen Welt beigetreten sind, einen speziellen Promo-Code aktivieren, der ihrem Konto eine Reihe von In-Game-Gegenständen hinzufügt, mit denen Spieler ihre Entwicklung in der neuen Welt erheblich beschleunigen und Ordnung in ihrem Königreich schaffen können .

    Code: D1F9-33BA-0C7F-BAF5

    Dieser Promo-Code kann im Spiel aktiviert werden, indem man den Registrierungsprozess durchläuft. Es ist bis zum 1. Juli gültig und kann nur einmal pro Konto verwendet werden.