Įeiti
Visos kompiuterių paslaptys pradedantiesiems ir profesionalams
  • Pradedančiam vartotojui: „1C:Enterprise“ programų sistemos programinės įrangos produktų skirtumai
  • Programos 1s 8.3 demonstracinė versija. Mobili aplikacija "UNF" NAUJIENA
  • Mūsų įmonės 1C valdymo nustatymas nuo nulio
  • Warface registracija nemokamai
  • Registracija į žaidimą World Of Tanks – ką reikia žinoti?
  • Starcraft II strategija ir taktika
  • Boto rašymas „Stronghold Kingdoms“. Boto, skirto Stronghold Kingdoms, rašymas Darbo kodai žaidimo tvirtovės karalystėms

    Boto rašymas „Stronghold Kingdoms“.  Boto, skirto Stronghold Kingdoms, rašymas Darbo kodai žaidimo tvirtovės karalystėms

    Ar norite būti perkeltas į kitą erą tikram nuotykiui? Paleiskite nemokamą internetinį žaidimą savo kompiuteryje „Tvirtovės karalystės“ ir išbandyti savo jėgas žiauriuose viduramžių karuose. Pajuskite, koks yra jūsų gyslomis šaltas kraujas, sužinokite, kiek turite adrenalino. Gilaus panardinimo į žaidimą efektas garantuotas. Stronghold Kingdoms 2019 m. rugsėjo–spalio mėn. – jauskitės kaip tikras herojus!

    Žaidėjai atsiduria viduramžių pasaulyje, kupiname pavojų, kuriame jiems teks priprasti ir įsikurti – nuo ​​namų kūrimo ir tvirtovės gynimo iki dalyvavimo kare.

    Žaidimo ypatybės:

    • žaidėjai stato ir plečia viduramžių tvirtoves, kurios atlaikys laiko išbandymą;
    • dalyviai tvarko kaimus, teisingai pastatydami juose pastatus, kad padidintų efektyvumą;
    • Prekybos kortelės pagalba žaidėjai galės prekiauti, tyrinėti, žvalgytis ir pan.;
    • ėjimas aukštų titulų keliu, siekiant įgyti galią;
    • kurkite ir žaiskite savo strategines kortas, kad įgytumėte gyvybiškai svarbų pranašumą.

    Įtampa šiame žaidime pasieks dangų, o pergalė leis pajusti tikrą euforiją. Kūrėjai reguliariai kuria naujas žaidimo versijas. Su kiekvienu atnaujinimu pridedama kažkas naujo, plečiamos galimybės, o žaidimas tampa dar ryškesnis, įvairiapusiškesnis ir įdomesnis.

    Kaip pritaikyti žaidimo „Stronghold Kingdoms“ kuponą 2019 m. rugsėjo–spalio mėn.?

    Norėdami gauti trokštamą „slaptą žodį“, mūsų svetainėje tiesiog pasirinkite vieną iš prekių, kurioms taikoma nuolaida, ir spustelėkite pelės mygtuką, tada sistema automatiškai išduos unikalų simbolinį numerį. Pritaikyti žaidimo „Stronghold Kingdoms“ reklamos kredito kodą gali visi norintys: nukopijuokite gautą numerį, sekite nuorodą ir įklijuokite raidžių ir skaičių derinį į specialų laukelį registruodamiesi gauti mokamas paslaugas. Nuolaidų kuponai galioja tik ribotą laiką, todėl visada atkreipkite dėmesį į akcijos laiką. Paprastai kuponų nuolaidos negali būti derinamos su nuolaidomis mokamoms sąskaitoms ir kitoms žaidimų paslaugoms, pažymėtoms „Specialus pasiūlymas“.

    Žaidimas platinamas nemokamai, atsisiunčiant žaidimo klientą iš oficialios „Firefly Studios“ svetainės.

    Palaukite, reklamos kredito kodai įkeliami

    Dabartiniai Stronghold Kingdoms premijų kodai ir reklamos kredito kodai pasirodė mūsų svetainėje tiesiai šiame puslapyje. Stronghold Kingdoms yra naujausia populiaraus žaidimo Stronghold kūrėjų naršyklės strategija.

    Žaidimas puikiai tinka gerbėjams, kurie nenori atsisiųsti kliento į savo kompiuterį. Visi senosios žaidimo versijos gerbėjai galės mėgautis žaidimu, nes dabar esate prisijungę. Dabar jūsų priešai yra žmonės, o ne robotai. Turite parodyti savo strateginius ir ekonominius įgūdžius, kad jūsų miestas nebūtų sunaikintas. Žmonėms, kurie apie žaidimą girdėjo pirmą kartą, reikia žinoti keletą dalykų. Pirma, jūs iš karto atsiduriate viduramžiais, kryžiaus žygių ir įvairių istorinių įvykių metu. Reikia pastatyti savo miestą, aptverti jį aukšta siena, sukurti maitinimo, pramogų sistemą ir, žinoma, suformuoti savo kariuomenę. Žaidimas sujungia daugybę skirtingų žaidimų, nes reikia stebėti gyventojų nuotaikas ir miesto vystymąsi, o kitame žemėlapio gale valdote kovas. Yra daugybė karių rasių ir kategorijų. Nuo galingų riterių iki paprastų plėšikų. Jūs turite nuspręsti, kaip vykdysite žaidimo politiką. Tačiau žaidimas tikrai paliks pėdsaką jūsų atmintyje, nes tokioje kūrimo sistemoje praktiškai nėra nieko tokio įsimintino ir ryškaus. Visi įvykiai vyksta realiu laiku, todėl sprendimus reikės priimti greitai ir apgalvotai.
    Pateikiame žaidimo Stronghold Kingdoms reklamos kodus, kurie suteikia jums didelių nuolaidų ir premijų. Jų dėka galite pasamdyti didelę armiją ir užfiksuoti artimiausias žaidėjų gyvenvietes arba sukurti miestą, kuris bus vertas vadintis žemėlapio sostine. Šio žaidimo akcijos nuolat atnaujinamos mūsų svetainėje, sekite visus įvykius.

    Kas pritraukia vartotojus į žaidimą Stronghold Kingdoms:

    • Galimybė bendrauti su daugeliu žaidėjų iš viso pasaulio: prekyba, mūšiai, pilių užgrobimas, šnipinėjimas ir daug daugiau;
    • Yra galimybė studijuoti disciplinas ir jas tobulinti. (Pavyzdžiui: žemės ūkis, pramonė, prekyba, kariniai reikalai);
    • Pasaulinis provincijų žemėlapis, kuriame viskas suskirstyta į regionus (rajonus). Kiekviena tokia sritis žaidėjui bus savotiška tėvynė;
    • Žaidimas su gyvais žaidėjais ir kompiuterių priešininkais (banditų stovykla, vilkų guolis, priešo apgulties stovykla ir žiurkės, gyvatės, šerno ir vilko pilys). AI gali užpulti žaidėjo savybes, todėl verta pasirūpinti apsauga!
    Ilgai kreipiausi į klausimą, kaip parašyti botą šiam žaidimui, bet arba trūko patirties, arba tingėjau, arba bandžiau priartėti iš neteisingos pusės.
    Dėl to, įgijęs patirties rašant ir atvirkštinės inžinerijos kodą C#, nusprendžiau pasiekti savo tikslą.

    Taip, kaip turbūt pastebėjote, C# nėra lengvas – žaidimas parašytas jame, naudojant .net 2.0, kuris vėliau įdėjo keletą stipinų į mano ratus.

    Iš pradžių galvojau parašyti socket botą, kuris tik emuliuotų tinklo protokolą (kuris jokiu būdu nėra užšifruotas), o turint „šaltinio kodus“ (il-kodo dekompiliavimo rezultatą) galima nesunkiai atkurti per trečią. - partijos paraiška.

    Bet man tai atrodė nuobodu ir nuobodu, nes kam vargti su dviračiu, jei turi tuos „šaltinio kodus“.

    Apsiginklavęs Reflector, ėmiau aiškintis žaidimo įėjimo tašką (kurio kodas jau daugiau nei trejus metus apskritai nebuvo užtemdytas, stebiuosi kūrėjais) – nieko ypatingo.

    Analizė ir iš dalies neteisingas sprendimas
    Akivaizdu, kad žaidimo projektas iš pradžių buvo sukurtas kaip konsolės programa:

    Privatus statinis void Main(string args) kaip įėjimo taškas ir jo Programos klasė tai rodo; klasė, beje, taip pat yra privati.

    Visų pirma puoliau viešinti klasę ir metodą, vėl naudodamas Reflector su Reflexil priedu, nežinodamas, ko tikėtis.

    Bet staiga susidūriau su paleidimo priemone, kuri atsisiunčia modifikuotą failą.
    Trumpai pakovojęs su juo tuo pačiu Reflector ir atlikęs skrodimą, ištraukiau kodą, skirtą žaidimo vykdomajam failui perduotų argumentų nustatymui:

    If (DDText.getText(0x17) == "XX") parametrai = nauja eilutė ( "-InstallerVersion", "", "", "st" ); // st == steam else parametrai = nauja eilutė ( "-InstallerVersion", "", "" ); parametrai = SelfUpdater.CurrentBuildVersion.ToString(); parametrai = DDText.getText(0); // Pasigilinęs sužinojau, kad tai žaidimo kalba, formatu „ru“, „de“, „en“ ir kt. Įkelta iš vietinio.txt failo, esančio šalia paleidimo priemonės. UpdateManager.SetCommandLineParameters(parametrai); // Ir tai yra jų įvynioklis, skirtas labiausiai paplitusiam System.Diagnostics.Process UpdateManager.StartApplication();

    Pažiūrėkime:

    If (DDText.getText(0x17) == "XX") – eilutė iš local.txt failo šalia paleidimo priemonės.
    Jie turi tokį keistą steam/no-steam variantų patikrą: X – be garo, XX – garo. :\
    parametrai = SelfUpdater.CurrentBuildVersion - Launcher versija, ramiai šokinėja nuo jos, nors patikrinimas kliente keistas, kaip vėliau išsiaiškinau, ir jūs galite tiesiog nurodyti daug didesnį skaičių nei dabartinis, „rezerve“, nes Tikrinama, ar versija, taip sakant, pasenusi palyginus skaičius „mažiau nei didesnis“.
    parametrai = DDText.getText(0) - Suklastojęs versiją, sužinojau, kad tai yra žaidimo kalba, formatu „ru“, „de“, „en“ ir kt.
    Jis taip pat įkeliamas iš local.txt failo.

    Beje, paleidimo priemonės versija atrodo maždaug taip:

    Static SelfUpdater() (currentBuildVersion = 0x75; // 117, t.y. iš tikrųjų 1.17.)

    Ir aš sukūriau stebuklingą paketinį failą:

    StrongholdKingdoms.exe -InstallerVersion 117 en

    Nors galite tai padaryti:

    StrongholdKingdoms.exe -InstallerVersion 100500 ru

    Apie ką aš kalbėjau šiek tiek aukščiau.

    Taigi, ką mes turime: šiek tiek pakeistą klientą ir paleidimo apėjimo sistemą, jei taip galima pavadinti.
    Pabandęs visa tai paleisti, matau, kad žaidimas veikia ir mano pataisymai jam nepakenkė (nors kodėl jie kenktų).

    Po to bandžiau prijungti žaidimo vykdomąjį failą prie projekto kaip klasės biblioteką ir prijungti žaidimo vardų erdvę – Kingdoms.

    Tada įvedžiau daug kodo: bandžiau iškviesti Main ir emuliuoti Program klasę, bet dėl ​​tam tikrų priežasčių žaidimas sudužo dėl ne dotnet-framework vykdymo laiko, kai tik bandžiau priversti jį veikti.
    Jis nurodė, kad žaidime naudojama daug ne C# bibliotekų ir daug nesaugaus kodo. Neradau jokių tikrų priežasčių.

    Sprendimas teisingas
    Ilgai kentėjęs ir neradęs sprendimo, pasidaviau. Bet kažkodėl prisiminiau Terraria serverio šakę - TShock (taip, šakutė, žinoma - vaikinai taip pat smaginosi su dekompiliatoriumi) ir jo modulių (modų/pluginų) įkėlimą iš DLL.

    Ši idėja man pasirodė įdomi. Googlinęs radau ir metodą, ir kodą.
    Šiek tiek įsigilinęs ir išbandęs savo projekte, su siaubu atradau, kad jis veikia (staiga!).
    Tiesą sakant, kodas:

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

    Pažiūrėkime į kodą:
    System.Reflection.Assembly – tai yra tas dalykas, kuris yra atsakingas už nuorodų į failus kūrimą jungiant juos prie projekto, tik iš kodo. Jame taip pat saugoma informacija apie jūsų projekto versijas ir autorių teises (taip, visuose projektuose ta pati AssemblyInfo.cs).
    Assembly.LoadFrom(System.Windows.Forms.Application.StartupPath + @"\BotDLL.dll") – įkelkite mūsų biblioteką.
    Tada mes iškviečiame funkciją šioje klasėje Inject (), kuri iš esmės yra roboto pradžia. =)
    Išbandžiau kodą, kurį nubraižiau trečiosios šalies programoje – injekcija suveikė.

    Kliento pataisymas
    Dabar pereikime prie smagiosios dalies – iššūkio kodo įdiegimo žaidime.
    Įžūliai pabandęs įklijuoti jį į Main, pakeisdamas kodą naudodamas Reflexil, jis buvo sėkmingai išsiųstas pataisyti tai, kas nebuvo pataisoma dėl dekompiliavimo. O gal aš tiesiog tingėjau, nesvarbu.
    Aš ieškojau šiame pačiame Pagrindiniame garantuoto skambučio trečiųjų šalių funkcijoms (už pagrindinio if filialų ir pan.) ir gana greitai radau iškvietimą į funkciją MySettings.load(), kuri paleidus įkėlė žaidimo nustatymus.
    Tačiau vėl pasirodė kalnas kodo, kuris nenorėjo kompiliuoti be deimantų.
    Tačiau laimei, šalia jo yra loginė funkcija hasLoggedIn(), kuri grąžina vieną loginę reikšmę tik prasidėjus žaidimui:
    grįžti (this.HasLoggedIn || (this.Username.Length > 0));
    Mane tai iškart nudžiugino ir ši funkcija iškart buvo pakeista į tokią:

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

    Susitvarkykime su juo.
    if (!IsStarted) – turėjome pridėti šį patikrinimą, o norėdami tai padaryti, į MySettings klasę įvesti papildomą lauką, nes mūsų funkcija iškviečiama daugiau nei vieną kartą, o kelių botų gijų mums tikrai nereikia. Tai atlieka tas pats Reflexil.
    Na, o pagrindinį kodą jau aptarėme šiek tiek aukščiau.
    Ir galiausiai grąžiname tai, kas čia turėjo būti. =)

    Taigi – pats botas
    Įpurškimo funkcija:

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

    Pirmiausia iškviečiame funkciją atidaryti konsolės langą – taip bus lengviau derinti.
    Tada pradedame srautą su savo pagrindine boto kilpa – SHK();
    Ir tuo pačiu patogumui atidarome boto valdymo formą.

    Tada belieka įdiegti reikiamas funkcijas.
    Štai likęs mano kodas – čia įdiegiau automatinę prekybos sistemą.
    Kad tai veiktų, kiekvienoje sesijoje pirmiausia turite „atsaugoti“ kaimus – atidaryti kiekvieną kaimą, kuriuo ketinate prekiauti.
    Šis kodas yra abejotinas, ir aš dar nesugalvojau kitų būdų, kaip automatiškai įkelti kaimus:

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

    Štai SHK funkcijos kodas:

    Paslėptas tekstas

    public void SHK() ( Console.WriteLine("Injekcija baigta!"); while (!GameEngine.Instance.World.isDownloadComplete()) ( Console.WriteLine("Pasaulis dar neatsisiųstas!"); Thread.Sleep (5000) ; // 5 sek. Console.Clear(); ) Console.WriteLine("Pasaulis įkeltas! Paleidžiamos branduolio operacijos."); Console.WriteLine("\n======| DERINIMO INFORMACIJA |= ==== ="); Console.WriteLine(RemoteServices.Instance.UserID); Console.WriteLine(RemoteServices.Instance.UserName); Sąrašas VillageID = GameEngine.Instance.World.getListOfUserVillages(); foreach (int VillageID VillageID) ( WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); Console.WriteLine("[Inicializacija] " + Village.m_villageName + " - " + VillageID); InterfaceMgr.Instance.selectVillage (VillageID); GameEngine.Instance.downloadCurrentVillage(); ) Console.WriteLine("======| ========== |=======\n"); while (true) ( ​​pabandykite ( // Čia galite įterpti ką nors savo ) gaudyti (išimtis, išimtis) ( Console.WriteLine("\n======| EX INFO |======" ); Console .WriteLine(ex); Console.WriteLine("======| ======= |======\n"); ) ) )


    Kontrolės formos kodas:

    Paslėptas tekstas

    naudojant sistemą; naudojant System.Collections.Generic; naudojant System.ComponentModel; naudojant System.Data; naudojant System.Drawing; naudojant System.Text; naudojant System.Windows.Forms; naudojant System.Threading; naudojant karalystės; naudojant System.CodeDom.Compiler; naudojant Microsoft.CSharp; naudojant System.Reflection; vardų erdvė BotDLL ( viešoji dalinė klasė BotForm: Form ( Thread TradeThread; bool IsTrading = false; public void Log(string Text) ( Console.WriteLine(Text); richTextBox_Log.Text = Tekstas + "\r\n" + richTextBox_Log. ) public BotForm() ( CheckForIllegalCrossThreadCalls = false; InitializeComponent(); this.Show(); Log("Rodoma roboto forma."); listBox_ResList.SelectedIndex = 0; Log("Pradėti prekybos giją..."); TradeThread = new Thread(Trade); TradeThread.Start(); ) private void button_Trade_Click(objekto siuntėjas, EventArgs e) ( // Jei pasaulis jau įkeltas ir tikslinis laukas užpildytas if (GameEngine.Instance.World.isDownloadComplete() ) && textBox_TradeTargetID.Text. Length > 0) ( pabandykite ( if (!IsTrading) // Jei neprekiaujame ( button_Trade.Text = "Stop"; IsTrading = true; // Tada mes prekiaujame ) else // Ir atvirkščiai ( button_Trade.Text = "Prekyba"; IsTrading = klaidinga; ) ) sugauti (išimtis, išimtis) ( Console.WriteLine("\n======| EX INFO |======"); Log(ex .ToString()); Console.WriteLine( "======| ======= |======\n"); ) ) ) public void Trade() ( Log("Prekybos srautas sukurtas!"); int Miego režimas = 0; while (tiesa) // Jei prekyba ( Miego režimas = 60 + naujas Atsitiktinis().Next(-5, 60); if (IsTrading) ( Log("[" + DateTime.Now + "] Įvedimas su \"" + listBox_ResList.SelectedItem.ToString() + "\""); // Gaukite produkto ID iš sąrašo int ResID = int.Parse(listBox_ResList.SelectedItem.ToString().Replace(" ", "").Split("-")); int TargetID = int. Parse(textBox_TradeTargetID.Text); // Gaukite tikslinio kaimo sąrašo ID VillageID = GameEngine.Instance.World.getListOfUserVillages(); // Gauti mūsų kaimų sąrašą foreach (int VillageID in VillageID) // Mes einame per juos ( // Jei kaimas įkeltas (jo žemėlapis buvo atidarytas bent kartą per dabartinę sesiją) if (GameEngine.Instance.getVillage( VillageID) != null) ( // Gaukite pagrindinę informaciją apie mūsų kaimą WorldMap.VillageData Village = GameEngine.Instance.World.getVillageData(VillageID); VillageMap Map = GameEngine.Instance.getVillage(VillageID); // Gaukite visą informaciją int ResAmount = (int)Map.getResourceLevel(ResID ); // Išteklių skaičius sandėlyje int MerchantsCount = Map.calcTotalTradersAtHome(); // Prekybininkų skaičius jame Log("Kaime yra " + MerchantsCount + " prekybininkų " + VillageID + "); // Derinimo int SendWithOne = int.Parse(textBox_ResCount.Text); // Prekybininko išteklių skaičius int MaxAmount = MerchantsCount * SendWithOne; // Išteklių skaičius bus išsiųstas, jei (ResAmount)< MaxAmount) // Если торговцы могут увезти больше чем есть MerchantsCount = (int)(ResAmount / SendWithOne); // Считаем сколько смогут увезти реально if (MerchantsCount >0) // Jei namuose yra prekybininkų ( TargetID = GameEngine.Instance.World.getRegionCapitalVillage(Village.regionID); // Prekiaukite su regionu, laikinai textBox_TradeTargetID.Text = TargetID.ToString(); // Iškvieskite aukštą lygmens prekybos funkcija su daugybe atgalinių skambučių GameEngine.Instance.getVillage(VillageID).stockExchangeTrade(TargetID, ResID, MerchantsCount * SendWithOne, false); AllVillagesPanel.travellersChanged(); // Patvirtinkite pakeitimus (prekybininkai paliko) GUI kliente ) ) ) Log("Pakartokite prekybos ciklą per " + Sleep + " sekundes per " + DateTime.Now.AddSeconds(Sleep).ToString("HH:mm:ss")); Console.WriteLine(); ) Siūlas.Miegas(Miegas * 1000); // Miegome, kad nepamestų šlamšto. Taigi mažiau gelsvos spalvos. ) ) private void BotForm_FormClosing(objekto siuntėjas, FormClosingEventArgs e) ( pabandykite ( TradeThread.Abort(); ) catch () ) private void button_MapEditing_Click(objekto siuntėjas, EventArgs e) ( button_MapEditing.GameEntext =diting. ).ToString(); GameEngine.Instance.World.MapEditing = !GameEngine.Instance.World.MapEditing; ) private void button_Exec_Click(objekto siuntėjas, EventArgs e) ( if (richTextBox_In.Text.Length ! == 0Engine | Instance.World.isDownloadComplete()) grąžinimas; richTextBox_Out.Text = ""; // *** Pavyzdinės formos įvesties kodas teksto laukelyje yra lcCode = richTextBox_In.Text; ICodeCompiler loCompiler = new CSharpCodeCompiler(CreateCompiler(). CompilerParameters loParameters = new CompilerParameters(); // *** Pradėkite pridėdami visas nurodytas agregatus loParameters.ReferencedAssemblies.Add("System.dll"); loParameters.ReferencedAssemblies.Add("System.Data.dll"); loParameters.ReferencedAssemblies. .Add("System.Windows.Forms.dll"); loParameters.ReferencedAssemblies.Add("StrongholdKingdoms.exe"); // *** Turite sukurti visiškai funkcionalų rinkinį kaip eilutę lcCode = @"naudojant sistemą; naudojant System.IO; naudojant System.Windows.Forms; naudojant System.Collections.Generic; naudojant System.Text; naudojant Kingdoms; vardų erdvę NSpace ( public class NClass ( viešasis objektas DynamicCode(params object Parameters) ( " + lcCode + @" return null; ) )"; // *** Įkelkite gautą rinkinį į atmintį loParameters.GenerateInMemory = false; // *** Dabar sukompiliuokite viską CompilerResults loCompiled = loCompiler.CompileAssemblyFromSource(loParameters, lcCode); if (loCompiled.Errors.HasErrors) ( string lcErrorMsg = ""; lcErrorMsg = loCompiled.Errors.Count.ToString() + " Klaidos:"; 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"); } } } }

    Iš pradžių norėjau prie roboto prijungti NLua (Lua biblioteka, skirta C#), bet kadangi ji palaiko tik 3.5+ karkasus ir kažkodėl nenorėjau naudoti senesnių versijų, padariau taip:
    Patogumo dėlei įvedžiau realaus laiko kodo vykdymą pačiame „Sharp“ – pavargau nuo žaidimo paleidimo iš naujo po pakartotinių kompiliacijų.
    Aš jį panaudojau.

    Apatinė eilutė
    Šio sprendimo privalumai:
    1. Pasiekite visą žaidimo kodą taip, lyg turėtumėte šaltinio kodą.
    2. Galite sukurti savo aukščiausios kokybės žemėlapių sistemą su pastatų eilėmis, neribotais tyrimais ir dar daugiau:
      • Prekių perpardavimo tarp jus supančių regionų algoritmas.
      • Pavyzdžiui, automatinė kaimo statyba „pagal modelį“, paimta iš esamo.
      • Įvairių padalinių automatinė nuoma.
      • Automatinis spynos taisymas jums išvykus.
      • Automatinis garantuotos kortelės paėmimas laikui bėgant.
    3. Ir, žinoma, dinaminis kodo vykdymas.
    4. Nejuokinga aptikimo apsauga. Na, dar pora sąlygų, kad nesiųstume įtartinų fiktyvių užklausų.
    Minusai:
    1. Turėsite pataisyti klientą rankiniu būdu naudodami kiekvieną versiją. Arba galite parašyti pataisą naudodami Mono.Cecil arba ekvivalentą sistemoje.
    2. Skirtingai nuo aukščiausios kokybės kortelių, turėsite nuolat palaikyti klientą ir prisijungti.
    3. Žaidimas yra gana didelis, todėl API studijavimas tikrai užtruks valandą. Nors, jei turėtų noro ir įrankių, puikiai išmanytų metus – jei turėtų noro. Ir bet kuriuo atveju tai geriau nei blaškytis su paketais.

    Štai kaip atrodo visas dalykas:

    Klasių sąrašas

    • Žaidimo variklis
    • GameEngine.Instance
    • GameEngine.Instance.World
    • Pasaulio žemėlapis
    • Pasaulio žemėlapis.Kaimo duomenys
    • Nuotolinės paslaugos
    • RemoteServices.Instance
    • „AllVillagesPanel“.
    • Kaimo žemėlapis

    Rašymo metu žaidimo versija buvo 2.0.18.6.
    Galite atsisiųsti šią konkrečią versiją su žaidimo ir roboto vykdomuoju failu.
    Nesijaudinkite, aš nevagiu asmeninės informacijos. =) Pavargau nuo žaidimo, todėl dalinuosi savo patirtimi su bendruomene.

    Yra šaltinio kodai.
    Jei ketinate naudoti šaltinio kodus, kaip klasės biblioteką naudokite švarų vykdomąjį failą (nepataisytą jūsų), taip pat išjunkite šios nuorodos kopijavimą į paskirties katalogą, kad netyčia nepakeistumėte pataisytos.
    žaidimų robotas Pridėti žymų

    Iš karto po apmokėjimo iš oficialaus tiekėjo - Akella įmonės - iš dėžutės su žaidimu Stronghold Kingdoms gausite licencijos rakto skaitmeninę kopiją, kurią turite įvesti į savo asmeninę žaidimo paskyrą, kad gautumėte 750 CZK vertės premijas:
    2 žetonai per mėnesį
    10 gamybos denių
    10 maisto denių
    5 gynybos kaladės (10 viename denyje)
    4 karo kaladės (10 vienoje kaladėje)
    30 atsitiktinių kortų kaladžių (10 vienoje kaladėje)

    Pradinis rinkinys idealiai tinka naujiems žaidėjams, norintiems greitai pradėti dominuoti viduramžiais Stronghold Kingdoms. Nesvarbu, ar norite taikiai ūkininkauti, įsitraukti į politinius žaidimus, ar atkeršyti prisiekusiems priešams, šis pradinis rinkinys suteiks jums galingą postūmį jūsų kelyje į karūną.

    Ar norite tapti baronu, kunigaikščiu ar karaliumi? Pasinerkite į kariaujančių feodalų pasaulį, į pasaulį, kuriame kuriami ir naikinami aljansai ir ištisos valstybės. Išbandykite viduramžių valdovo vaidmenį. Sostas laukia tavęs, Valdovas!

    Žaidimo ypatybės:
    - Prisijunkite prie tūkstančių žaidėjų tikroviškame viduramžių pasaulyje.
    - Pastatykite puikias tvirtoves, kurios tęsis šimtmečius!
    - Apginkluokite savo armijas ir užkariaukite kaimynų žemes!
    - Stebėkite, kaip jūsų kaimai, miestai ir pilys atgyja ir auga.
    - Ištirkite šimtus patikimų technologijų.
    - Žaisk Senovės Rusijos žemėlapyje!

    Šis kodas neturi teritorinių apribojimų (nemokamas regionas)
    Kalbos: rusų, anglų
    Leidėjas: Akella

    Papildoma informacija

    Žaidimas Stronghold Kingdoms yra nemokamas (nemokamai žaidžiamas), jį galite atsisiųsti per Steam - http://store.steampowered.com/app/47410/

    Norėdami suaktyvinti pradinį 750 kronų premijų rinkinį, turite vadovautis paprastomis instrukcijomis:
    1. Prisijunkite prie esamos paskyros arba užregistruokite naują oficialioje žaidimo svetainėje http://login.strongholdkingdoms.com/kingdoms/account.php
    2. Į laukelį „Suaktyvinti kodą“ įveskite po apmokėjimo gautą aktyvinimo kodą, spustelėkite pasirodžiusį patvirtinimo mygtuką
    3. 750 kronų vertės premijos jau jūsų sąskaitoje!

    Būk atsargus! Šį kodą savo paskyroje galite suaktyvinti tik vieną kartą!

    Taip pat siūlome atkreipti dėmesį į panašius produktus:
    STRONGHOLD KINGDOMS – PREMIJOS UŽ 350 KRONŲ –

    Jus taip pat gali sudominti kiti mūsų platinami žaidimai. Visą sąrašą rasite nuorodoje:

    Atsiliepimai

    54

    Iš klientų atsiliepimų negauta.

    Už teigiamą įsigytos prekės įvertinimą pardavėjas padovanos dovanų kortelę sumai 5,99 RUB .

    Siekdama atremti autorių ir nuosavybės teisių pažeidimą, taip pat atmesti nepagrįstus kaltinimus svetainės administracijai dėl bendrininkavimo darant tokį pažeidimą, Plati prekybos platformos (http://www.site) administracija kreipiasi į jus su prašymą – aptikus pažeidimus prekybos platformoje Plati, nedelsiant informuoti mus adresu tokio pažeidimo faktą ir pateikti patikimą informaciją, patvirtinančią Jūsų autorines ar nuosavybės teises. Laiške būtinai nurodykite savo kontaktinius duomenis (vardą, pavardę, telefono numerį).

    Siekdama atmesti nepagrįstus ir tyčia melagingus pranešimus apie šių teisių pažeidimus, administracija atsisakys teikti paslaugas Plati prekybos platformoje tik gavusi iš Jūsų rašytinius pareiškimus apie pažeidimą kartu su dokumentų, patvirtinančių Jūsų autorines ar nuosavybės teises, kopijomis, el. Adresas: 123007, Maskva, Maly Kaluzhsky lane. 4, korpusas 3, Advokatų kontora „AKAR Nr. 380“.

    Siekdama operatyviai reaguoti į Jūsų teisių pažeidimus ir būtinybę blokuoti nesąžiningų pardavėjų veiksmus, Plati prašo atsiųsti patvirtintą telegramą, kuri bus pagrindas blokuoti pardavėjo veiksmus, šioje telegramoje turi būti nuoroda : pažeistų teisių rūšis, savo teisių patvirtinimas ir kontaktiniai duomenys (organizaciniu požiūriu – asmens teisinė forma, vardas ir pavardė). Blokavimas bus panaikintas po 15 dienų, jei nepateiksite Advokatų biurui rašytinių dokumentų, patvirtinančių Jūsų autorines ar nuosavybės teises.

    „Firefly Studios“ savo pilies MMO išleido ambicingą naują pasaulį rusų kalba Stiprybių karalystės. Pasaulis 6 atvėrė savo vartus birželio 15 d., o tūkstančiai žaidėjų plūdo išbandyti naują žaidimų serverį su nauja mechanika, kuri buvo pristatyta žaidimui naujausiame atnaujinime. Naujasis pasaulis prieinamas tiek naujiems žaidėjams, tiek veteranams Karalystės. Jis parengtas remiantis geografiniu vakarinės Rusijos dalies, taip pat ją supančių regionų ir šalių, įskaitant Baltijos šalis, Ukrainą, Baltarusiją, Kazachstaną ir kitas valstybes, žemėlapiu.

    Žaidėjai gali kovoti už šių teritorijų kontrolę, susijungdami į galingus namus su savo taisyklėmis ir savybėmis. Šis pasaulis nuo ankstesnių skiriasi atnaujinta žaidimų mechanika, kuri riboja religijos naudojimą ir suteikia daugiau galimybių pradedantiesiems. Tai antrasis pasaulis Stronghold Kingdoms, kuriame naudojamos naujos taisyklės, ir pirmasis „vietinis“ pasaulis, kuriame šios taisyklės buvo nustatytos.

    Be rusakalbių, Karalystės Taip pat yra britų, vokiečių, prancūzų, ispanų pasauliai ir pasauliai, pagrįsti pasauliniu žemėlapiu. Šiuo metu visi žaidėjai, prisijungę prie naujojo pasaulio, gali suaktyvinti specialų reklamos kodą, kuris pridės prie jų paskyros žaidimo elementų rinkinį, kuriuo žaidėjai gali žymiai pagreitinti savo tobulėjimą naujame pasaulyje ir nustatyti tvarką savo karalystėje. .

    Kodas: D1F9-33BA-0C7F-BAF5

    Šį reklamos kredito kodą galima suaktyvinti žaidime, atlikus registracijos procesą. Jis galios iki liepos 1 d. ir gali būti naudojamas tik vieną kartą vienoje paskyroje.