da sich, wie ich sehe, immer mehr Leute dafür begeistern mit Clienten bzw. mit Python zu arbeiten habe ich mich dazu entschlossen eine kleine Einführung in die Geschichte von Metin2 und Python zu schreiben. Wir wollen auch nicht lange um das Thema herum reden und fangen direkt an, jedoch noch an dieser Stelle, ich bin kein "Profi" oder sonstiges ich lerne selbst noch und deshalb sind alle Angaben ohne Gewähr auf Richtigkeit! <--- Was nen Wort LETS GO!
Benötigtes:
Quote:
- Notepad ++
- Python 2.2 - Nicht umbedingt nötig, wird jedoch empfohlen
- Geduld
- Einen Metin2 Clienten den ihr entpacken und packen könnt
- Mt2PythonLoader von Musicinstructor
Fangen wir erstmal mit ein paar Grundlagen an, die ihr für Pythondateien in Metin benötigt:
Jede Pythondatei in Metin (ausgenommen der, die für die grafische Positionierung verantwortlich ist) fangen in dem, wie ich ihn nenne, "Leerkopf" mit den Imports an. Imports sind mit die wichtigsten Instanzen in einer eigenständigen Pythondatei denn diese importieren, wer hätte das gedacht, bereits vorgegebende Bibiliotheken. Diese werden benötigt, damit ihr bestimmte Befehle verwenden könnt. So wird für den Befehl "net.SendChatPacket()" die Bibiliothek "net" benötigt. Allerdings fragen sich manche bestimmt wie importiere ich eine solche Bibiliothek und woher weiß ich welche für welchen Befehl benötigt wird? Zum Thema, welche Bibiliothek welche Befehle ermöglicht wird später eine Liste folgen. Nun zeige ich euch jedoch kurz mit 5 Bibiliotheken wie man eine Bibiliothek einbindet:
PHP Code:
import ui import app import net import chat import player
Das ist doch ganz einfach, oder? Jedoch ist es an dieser Stelle wichtig, dass ihr wisst, dass die ui in 90% aller Scripts importet wird, da sie eine weitere Grundlage für viele Befehle und Aktionen ist.
Weiter geht es dann in einer Datei mit den Klassen. Die Klassen definieren einen Gültigkeitsbereich für Variabeln und Funktionen. Ich belasse es an dieser Stelle jedoch vorerst dabei, da das nicht ganz richtig ist, ich aber nicht vorgreifen möchte! Eine Klasse ist meist in einer Datei nur 1-2 Mal vertreten und wird so defniert, wie im folgenden Zeilenbeispiel demonstriert wird.
Sie steht direkt unter den Imports.
PHP Code:
class NAME(ui.ScriptWindow):
Das sollte auch nicht weiter schwer sein zu verstehen, jedoch müsste man nun kurz erklären, was in den Klammern steht, jedoch belassen wir es auch hier dabei, dass dort eine andere Class in der ui aufgrufen wird und ihr hier
seht, dass die UI schon benutzt wird. Ich entschuldige mich dafür, aber an dieser Stelle reicht das Wissen darüber, dass dafür das ScriptWindow gebraucht wird vollkommen. Ich werde in späteren Ausführungen, in denen diese Bereiche eine wirklich wichtige Rolle spielen noch genauer darauf eingehen.
Nun kommen die Standartfunktionen, die in jeder Datei vorhanden sein müssen - wobei nicht alle von Bedeutung sind, ich diese aber aus Gewohnheit mittlerweile mit einbaue - und wir in unserem Fall in der Class das "ScriptWindow" benutzten. Diese wären jetzt:
Hierbei ist im Grunde nur zu bemerken, dass die __init__ Funktion der erste Einstiegspunkt von der Class ist, wenn diese aufgerufen wird. Mithilfe der __del__ wird ermöglich, die Class bzw. das Fenster zu "zerstören" bzw. zu beenden. Die Destory jedoch ist nicht, wie ihr Name sagt, zum zerstören da, sondern sie "versteckt" jediglich das, was hier aufgerufen wurde. Somit läuft es theoretisch im Hintergrund mit. Die Show jedoch macht genau das wozu ihr Name da ist, sie zeigt uns den Ablauf bzw den Aufruf an, welchen wir anwählen. Somit haben wir nun die Grundlagen für eine neue Pythondatei gelegt. Ich gebe euch jetzt noch ein fertiges Leerscript vor, welches keine Funktionen besitzt, aber von euch später erweitert werden soll.
Um jedoch die Grundlagen zu vervollständigen gebe ich jetzt noch ein Beispiel wie eine Variable definiert wird und wie man einen Funktionskopf erstellt. Beginnen wir mit der Variable: Diese wird mit ihrem Namen, einem Gleichheitszeichen und dem nachstehenden Wert definiert sprich:
PHP Code:
Text = "Sie hat nun den Wert, welcher in den Gänsefüßchen steht" Zahl = 18
Das ganze könnte man jetzt mit einem Beispiel in der Python (Commandline) veranschaulichen. Dazu müsstet ihr einfach die oben stehenden Variabeln abtippen und dann den Variabelnamen absenden, dann seht ihr, dass diese ihre nachstehenden Werte angenommen haben. Wichtig zu wissen ist, dass man eine Variable anders wie in manch anderer Sprache keinem Datentyp zuweisen muss, denn das übernimmt das System von alleine!
Eine Funktion beginnt immer mit einem Funktionskopf. Dieser wird DEFiniert mit deinem NAMEN und den Werten in den () und wird dann mit einem Doppelpunkt beendet. Das sähe dann so aus:
PHP Code:
def Test(self):
Wie ihr hier seht, besitzt die Funktion Test einen Attribut "self". Dieser wird immer angegeben, da das darauf verweißt, dass dieser Funktionskopf seinen "Körper" ausführt, sprich den Code den die Funktion an sich enthält. Jedoch kann eine Funktion auch Werte mitgeliefert bekommen, welche ihr dann in ihr weiter verarbeiten könnt. Das würde dann so aussehen:
PHP Code:
def Test(self, WERT1, WERT2):
In diesem Beispiel könnte man nun einen Wert errechnen. Dazu mache ich auch noch ein Beispiel, jetzt allerdings zeige ich euch zuerst wie dieser ihr den Wert weitergebt, was so geht:
PHP Code:
self.Test(19, 1)
def Test(self, WERT1, WERT2): X = WERT1 + WERT2 return X
Hier werden nun die Zahlen 19 und 1 übergeben, diese werden dann in unserer Testfuntkion addiert und das Ergebnis wird mit dem Befehl return zurück gegeben. Dieses Beispiel muss nicht zu 100% an dieser Stelle verstanden werden, jedoch sollte man wissen, wie man einen Wert einer Funktion übergibt und wie dafür der Funtkionskopf heißen muss!
Nach der ganzen Theorie beginnen wir direkt damit eine Art von "Hallo Welt" - Script für den Chat in Metin2 zu erstellen. Das hört sich jetzt nich sooo spannend an, ist es auch nicht wirklich, trotzalledem legt es den Grundstein für die Arbeit mit dem Clienten bzw. mit Python im Bereich des Metin2 Clienten. Damit das ganze am Anfang noch sehr leicht ist, erstellen wir das Script in der game.py aus der root, weil dort nicht darauf geachtet werden muss, ob die Bibiliotheken beireits eingebunden sind und ihr keine Klasse starten müsst. Jetzt erstellen wir zuerst einen Abruf, welcher eine Funktion ausführen soll, wenn die Taste F10 gedrückt wird. Dafür sucht ihr nach:
Und schon haben wir einen Hotkey für die Funktion __HalloWelt bestimmt, welche wir jetzt nur noch erstellen müssen, damit das auch funktioniert, denn wenn man jetzt F5 drücken würde, so könnte man eine Fehlermeldung vom Clienten bekommen bzw. dieser würde garnicht erst starten, weil er die Funktion nicht finden kann.
Nun erstellen wir die Funktion __HalloWelt direkt über den anderen Hotkey-Funktionen. Dazu suchen wir jetzt nach
PHP Code:
def __PressNumKey(self,num):
Und Schreiben darüber unsere Funktion __HalloWelt:
PHP Code:
def __HalloWelt(self):
Nun ist der Funktionskopf vollständig erstellt, jetzt fehlt noch der Funktionskörper mit unserer Anweisung die regelt, was passieren soll, wenn die Funktion abgerufen wird. Dazu setzten wir nun einen Befehl ein, welcher bereits bei den Grundlagen für die Imports genannt wurde. So nehmen wir nun den Befehl "net.SendChatPacket()". Dieser ist in der Form jedoch noch nicht ganz vollständig, denn wir müssen mit den Attributen arbeiten, welche der Befehl benötigt. Es ist wie mit unseren Funktionen und ihren Attributen/Werten (siehe Grundlagen Funktionen). So müssen wir dem Befehl den ChatType und unseren Text mit geben. Das würde nun so aussehen:
PHP Code:
def __HalloWelt(self): net.SendChatPacket("Hier komme ich!")
Damit hätten wir unsere Funktion nun vervollständigt. Nun speichern wird das ganze ab und schauen uns an, was InGame passiert, wenn man F10 drückt. Sollte kein Text ausgegeben werden, so seht noch einmal selbst nach, ob ihr einen Fehler findet, wobei es meistens nur Fehler mit TAB´s sind. Andernfalls postet doch bitte eure Syserr und euren Code als Screen in einem Spoiler
unter diesen Beitrag.
Kapitel 2.0 - Das erste eigenständige Script als Board
Diesmal wollen wir etwas erschaffen, dass sich etwas schwerer gestalten sollte, da es sich nun um ein eigenständiges Board in einer alleinstehenden Pythondatei sein soll. Dazu erstellt ihr euch erstmal eine Pythondatei mit der Endung .py. Meine heißt in diesem Beispiel "uilernboard.py". So nun öffnen wir diese und legen erstmal die Imports fest. Deshalb muss man sich an der Stelle schon mal überlegen, was soll das Script machen und was brauche ich. Imports können ja immer noch später hinzugefügt werden, jedoch finde ich
bringt es schon mal eine kleine Übersicht in die Datei, wenn ich weiß, was ich brauche. Da wir ein Board erstellen wollen brauchen wir wie in den Grundlagen gelernt die ui. Weitere Imports werden an dieser Stelle jetzt noch nicht benötigt. Danach folgt jetzt erstmal die Klasse ich definiere diese jetzt als
PHP Code:
class LernWindow(ui.ScriptWindow):
somit ist der "Header" schonmal vollständig. Jetzt fehlen eigentlich nur noch die Grundfunktionen, welche das sind wissen wir bereits aus den Grundlagen. Also tragen wir diese in unser Script ein. An dieser Stelle kommen wir jetzt erstmal zu etwas neuem, da wir jetzt in der Funtkion __init__ einen Abruf einer anderen Funktion eintragen müssen und dazu noch diese Funktion mit einem Board füllen müssen. So schreiben wir nun erstmal unter
PHP Code:
ui.ScriptWindow.__init__(self)
unseren Abruf unserer gleich definierten Funktion ich nenne diese
PHP Code:
self.LoadBoard()
Jetzt wird unsere Funktion LoadBoard direkt beim laden der Pythondatei mit ausgeführt. In diese LoadBoard schreiben wir nun ein Script welches ein Board im Clienten öffnet, wer hätte das bei diesem Namen je erraten?!. An dieser Stelle finde ich es euch wichtig zu sagen, dass ihr Funktionen und Variabeln ambesten danach benennen solltet, was diese auch tuen sollen,
da Python eine OpenSource - Sprache ist und es später für andere besser verständlich ist, diesen Quelltext zu lesen, als wenn da Variabeln und Funktionen mit Namen wie Noob, Raicon, Hsagd2 drin stehen. Jetzt aber wieder zurück zum Script. Nachdem wir nun unsere Funktion haben in der init aufrufen lassen, sollten wir diese auch erstellen und ihr eine wirkliche Funktion geben. So erstellen wir nun die Funtkion LoadBoard direkt unter der Destroy Funktion. Jetzt fehlt eigentlich nur noch das Board. Dieses erstellen wir auch nun, dazu solltet ihr euch einen Namen überlegen, der dazu passt, bei mir ist es nun Board, weil es ja auch ein Board ist. Nun kommt der wichtigste Schritt bei einem Board, denn es muss definiert werden ob es ein
Board mit festen Hintergrund ist oder eins mit durchsichtigen Hintergrund. Wir wählen jetzt das Board mit dem festen Hintergrund. Dazu schreiben wir nun, da wir unsere Variable Board auch als solches definieren wollen
PHP Code:
self.Board = ui.Board()
wie wir hier sehen wird wieder gebrauch von der Ui gemacht. Nun ist die Variable als Board definiert, jedoch müssen wir unserem Board noch ein paar Informationen beifügen, damit es auch ein richtiges und sehbares Board wird. Dazu definieren wir als erstes nun die Größe des Boards. Dies würde nun wie folgt aussehen:
PHP Code:
self.Board.SetSize(300, 300)
damit wäre unser Board nun 300x300 Pixel lang/breit. Jetzt müssen wir noch angeben wo das Board beim öffnen im Fenster erstellt werden soll, dies ist nicht zwingend nötig, da es bei einer leeren Angabe immer in der oberen linken Ecke erscheint. Dazu schreiben wir, weil wir das Board in der Bildschrimmitte haben wollen:
PHP Code:
self.Board.SetCenterPosition()
dieser Attribut berechnet automatisch die Bildmitte zur Höhe und Tiefe des Board. Die Formel gebe ich euch an dieser Stelle trozdem schonmal, damit ihr wisst, was genau dort berechnet wird.
Ich bitte euch diese Formel einzuprägen, da sie gebrauch finden wird, wenn ihr selbständig Fenster auf bestimme Positionen bringen wollt zur jeweiligen Fenstergröße. Jetzt müssen wir dem Board aber auch noch 2 weitere Attribute hinzufügen, da es sonst nicht bewegbar ist und starr an der Stelle stehen bleibt, wo es aufgerufen wurde. Deshalb schreiben wir nun die Attribute "movable" und "float" zum Board. Dies würde so aussehen:
Abschließend fehlt eigentlich nur noch der Attribut welcher es ermöglicht, dass Board anzeigen zulassen. Dies würde nun der Show() Attribut sein und wie folgt aussehen:
PHP Code:
self.Board.Show()
Wichtig hierbei ist es, dass wir uns aber für diesen Attribut eine Funktion erstellen, die sich Show nennt. Diese sieht dann so aus:
PHP Code:
def Show(self): self.Board.Show()
Ihr fragt euch bestimmt wieso immer dieses self. vor dem Board steht, dies beantworte ich euch auch erst jetzt, da es mir hier an dieser Stelle etwas logischer erschien als es mitten im Script zu nennen. Also es steht dort immer self. damit der folgende Attribut nach Board auch wirklich direkt auf das Board bezogen ist.
ACHTUNG! Unter eurer letzten Zeile müsst ihr eine Leerzeile anlegen, also eine Zeile ohne Inhalt, diese darf aber keinen grauen senkrechten Strich enthalten also den ich nenne es Funktionsbaum, sondern muss BLANK sein! Wie ihr das macht? Ihr geht direkt zum Anfang der Zeile, dabei dürfen keine TABs oder Leerzeichen in der Zeile sein, dann tippt ihr einen Buchstaben ein und löscht diesen wieder. Fertig eure Zeile ist nun blank! Hier noch ein Bild, oben ist es falsch darunter ist es richtig!
Somit ist das Script nun komplett. Jedoch kann man das Board nicht einfach in den Clienten packen und es wird automatisch aufgerufen, nein auch dafür muss man einen Hotkey festlegen und dies wird nun eure Aufgabe sein. Jedoch gibt es von mir noch etwas hilfe wie man ein anderes PyScript laden kann. Dazu schreibe ich euch diese Zeilen
Quote:
import PYTHONDATEI
VARNAME = PYTHONDATEI.KLASSE() ### OHNE INHALT VON ui.Sc....
VARNAME.ATTRIBUT ZUM ANZEIGEN
Abschließend will ich sagen, dass ich sehen werde ob ich diesen Thread hier Update und weitere Kapitel einfüge. Es kommt halt darauf an ob ihr daran interessiert seit oder halt nicht.
Und noch etwas, ich weiß das es für einige hier nichts besonderes mehr darstellt aber es ist für diejenigen, die es lernen möchten und noch keine bzw. kaum Erfahrung damit haben! Also sagt jetzt nicht, äh das kann doch jeder, denn genau das kann eben nicht jeder!
Find Ich super, habe mich seit kurzen auch erst mit dem Metin2 Bereich"lichen" Python
befasst und würde gerne noch mehr von diesem Tutorial sehen. Am besten lernt man
ja durch vorhandene Pythonscripts im Clienten wenn man sich wirklich dafür
begeistert, aber wenn die IQ Volume weniger als die > Grundbasis < beträgt hilft
natürlich auch ein Tutorial, aber mal davon abgesehen würde Ich gerne noch sehen
was so folgen wird.
Hab ich mir direkt als Lesezeichen abgespeichert .
Nachdem mein Projekt Online ist, schau ich mir dein How-To genau an,
und versuche endlich mal Python zu lernen.
Sieht wirklich gut aus .. Habe mir den Anfang + ein paar Abschnitte in den Kapiteln durchgelesen . Werde Ich mir heute Mittag genauer durchlesen und mal schauen was daraus wird ..
An sich ist es nett, aber ist eben nur der Urschleim, dau nur ein Bruchteil.
Dazu musste ich bei manchen Stellen schmunzeln, das du nach einer Zeit die gleichen Unnötigen Sachen machst wie ich damals. Def bedeutet nicht Definieren, Python ist großteils aus Englischen Begriffen und dann soll ein Deutsches Wort es bennen? Mh.
Dazu dieses __del und Destory Funktion ist auch riesen Quatsch. Das einzigste was ein Script braucht sind die richtigen Ausführungsarten. Du musst nichtmal eine Class anfertigen, eine einzellne Funktion macht es auch. Dazu das mit ScriptWindow ist auch Quatsch. Wenn man ThinBoards machen will, blockiert das ScriptWindow das Board und es kommt ein Error.
Bevor du es als Hate anssiehst, gebe ich dir ein Tipp für das Thread.
Mir persönlich fehlen standartisierte Python Errors. Von Line Fehlern, bishin du string Fehlern, damit man schon im groben weiß wo der Fehler liegen könnte. Ich saß schonmal 2 Wochen fest zu anfangszeiten wohl gesagt, das beim .Show mit die Klammern dahinter fehlten.
An sich ist es nett, aber ist eben nur der Urschleim, dau nur ein Bruchteil.
Dazu musste ich bei manchen Stellen schmunzeln, das du nach einer Zeit die gleichen Unnötigen Sachen machst wie ich damals. Def bedeutet nicht Definieren, Python ist großteils aus Englischen Begriffen und dann soll ein Deutsches Wort es bennen? Mh.
Dazu dieses __del und Destory Funktion ist auch riesen Quatsch. Das einzigste was ein Script braucht sind die richtigen Ausführungsarten. Du musst nichtmal eine Class anfertigen, eine einzellne Funktion macht es auch. Dazu das mit ScriptWindow ist auch Quatsch. Wenn man ThinBoards machen will, blockiert das ScriptWindow das Board und es kommt ein Error.
Bevor du es als Hate anssiehst, gebe ich dir ein Tipp für das Thread.
Mir persönlich fehlen standartisierte Python Errors. Von Line Fehlern, bishin du string Fehlern, damit man schon im groben weiß wo der Fehler liegen könnte. Ich saß schonmal 2 Wochen fest zu anfangszeiten wohl gesagt, das beim .Show mit die Klammern dahinter fehlten.
Ne ist ja kein Hate sondern nur Kritik, aber wenn du es auch richtig gelesen hast habe ich z.B. erwähnt, dass es bei den Funktionen wie __del__ auch unnütze dabei sind Und man braucht keinen Class ist mir auch klar, aber nehme die Class, weil ich denke, dass man so besser aus anderen Datein darauf zugreifen kann. Und es soll hier ja kein standart Python sein, sondern nur ein bisschen für Metin. Dazu wäre das nächste Kapitel mit der Fehlercode analyze aber habe es noch net hier bei gefügt, sagte ja erweiter das hier nur, wenn es Leute gibt, die es gerne wollen.
Hm benutze im Normalfall kein ScriptWindow sondern einfach Window oder halt direkt das Board als ClassFunktion. Es ist ja auch für Anfänger gedacht und nicht für jemanden wie dich, der es alles schon etwas kann.
[HowTo]Learn Python with Metin2/Starting up your first bot 08/25/2018 - Metin2 PServer Guides & Strategies - 34 Replies Heute möchte ich euch eine kleine Einleitung in die Python Programmierung mit Hilfe des Metin2 Clienten ein wenig näher bringen.
Aber erstmal ein paar kleinere Informationen zu mir:
Ich studiere aktuell Softwaretechnik an der Universität Stuttgart wobei sich dies mehr auf Java beläuft.
Aber der wichtigste Part der Informatik ist grundlegend nicht eine Sprache perfekt zu beherrschen, sondern sie zu verstehen.
Python scripte ich nun seit knapp 2,5 Jahren und habe auch schon verschiedene,...
[Python-Modul]EXP-Donator (kompatibel mit Python Loader) 11/23/2013 - Metin2 Hacks, Bots, Cheats, Exploits & Macros - 27 Replies Moin,
da man mich danach gefragt hat und ich sowieso mal ein Beispiel für die Benutzung meines Python Loaders veröffentlichen wollte, habe ich die Gelegenheit genutzt und euch eben einen EXP-Spendebot geschrieben.
Man kann ihn einfach mit dem oben verlinkten Python Module Loader laden und ihn mit F5 aktivieren/deaktivieren.
Sobald ihr mehr als 99 Erfahrungspunkte habt (man kann nur in 100er Schritten spenden), werden alle Erfahrungspunkte an eure Gilde gespendet.
Wer Lust hat und...
Suche: Metin2 python bonusswitcher howto 11/23/2011 - Metin2 - 4 Replies Hey.
Ich hatte hier im Forum eine erklärung , für
den metin2 python bonusswitcher gesehen ,
wie man den machen kann,
denn ich aber nicht mehr finde.
Kann mir bitte einer den link zum Thread geben.
Der switcher ist von RealFreak