Register for your free account! | Forgot your password?

You last visited: Today at 07:28

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Guide] Lua/Python Tutorial

Discussion on [Guide] Lua/Python Tutorial within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.

Reply
 
Old   #1

 
elite*gold: 0
Join Date: Mar 2013
Posts: 2,449
Received Thanks: 6,446
[Guide] Lua/Python Tutorial

Guten Tag,

da Ich grade etwas Langeweile habe, wollte Ich mal die Methode erklären,
mit welcher .Alessa das Kostümsystem gemacht hat - die Client-Quest-Kommunikation.

Dieses Tutorial wird die Programmiersprachen Lua und Python enthalten.

Fangen wir mal mit dem Python-Teil an:

Als Erstes öffnet ihr die constInfo.py und tragt eine "Variable" ein.
Die Werte, die man dort einträgt, kann man in etwas mit einer Questflag vergleichen.

Ich schreibe einfach mal Costume = 0 rein.

Der Unterschied zu einer Questflag:
Wenn der Client geschlossen wird, erhält der Eintrag wieder seinen Startwert,
bzw. den ursprünglichen Wert.
In diesem Fall wäre der Wert wieder 0.

Danach öffnet Ihr die game.py und sucht nach folgendem Source:
Code:
serverCommandList={
Dort werden die Befehle und die dazugehörigen Funktionen aufgelistet, welche
per cmdchat über eine Quest angesprochen werden können.

Ihr geht an's Ende der Liste und fügt in etwa sowas ein:

Code:
"costume"			: self.__Costume,
Danach geht ihr an's Ende der game.py und deklariert eine neue Funktion.

Das macht ihr so:

Code:
def __Costume(self, in):
Das self ist sozusagen eine Referenz für die Funktion.
Es ist relativ das Gleiche, wie ein Pointer (oder auch Zeiger) in anderen Sprachen.

Hinweis: Ein Pointer zeigt auf die Speicheradresse einer Variable/Funktion o.ä .

Das in ist einfach nur ein Parameter, der per cmdchat später übergeben wird.

So.
Die Funktion soll bewirken, dass der constInfo-Eintrag geändert wird,
da dieser später noch gebraucht wird.

So kann man andere Dateien bearbeiten bzw. auf sie zugreifen:

Um es zu verdeutlichen importiere ich die Datei, obwohl es in der game.py unnötig ist,
die constinfo.py zu importieren.

Code:
import constinfo
Damit haben wir constinfo.py importiert und können Einträge ändern und auch auslesen.

Ein Beispiel für das Auslesen:

Code:
x = constInfo.Costume
Damit hat man dann der Variable x den Wert des constInfo-Eintrages zugewiesen.
Die Variable x könnten wir jetzt als constInfo-Eintrag für if-Blöcke, Schleifen o.ä verwenden.

Ein Beispiel für das Bearbeiten:

Code:
constInfo.Costume = 0
Wenn man x = 0 schreiben würde, würde es nichts bringen, da x nur einen neuen Wert bekommt,
aber der Eintrag nicht.

Da der constinfo-Eintrag den Wert des übergebenen Paramaters bekommen soll,
sollte die Funktion in etwa so aussehen:
Code:
def __Costume(self, in):
	import constinfo
	constInfo.Costume = in
So erhält der Eintrag den Wert des Parameters.

Da es jetzt kein GUI-Tutorial o.ä werden soll, habe ich eins vorgeschrieben,
welches ihr mit F5 öffnen könnt.

Code:
onPressKeyDict[app.DIK_F5]	= lambda : self.__costumebutton()

def __costumebutton(self):
	self.Board = ui.Board()
	self.Board.SetSize(200, 200)
	self.Board.SetCenterPosition()
	self.Board.Show()
	
	Button1 = ui.Button()
	Button1.SetParent(self.Board)
	Button1.SetUpVisual("d:/ymir work/ui/public/large_button_01.sub") 
	Button1.SetOverVisual("d:/ymir work/ui/public/large_button_02.sub") 
	Button1.SetDownVisual("d:/ymir work/ui/public/large_button_03.sub") 
	Button1.SetText("Klick")
	Button1.SetEvent(self.__buttonfunc)
	Button1.SetPosition(100, 50) 
	Button1.Show()
	
def __buttonfunc(self):
	event.QuestButtonClick(constInfo.Costume)
Was event.QuestButtonClick(constInfo.Costume) bedeutet,
könnt ihr in dem offiziellen Release nachlesen.


Nun der Lua Teil:

Wir fangen mal damit an, dass beim Login der Questindex (Platz in der questlist)
an die game.py übergeben wird.

Das sieht dann so aus:
Code:
when login begin
	cmdchat("costume "..q.getcurrentquestindex())
end
q.getcurrentquestindex() gibt den Platz in der Questlist wider,
der für diese Methode benötigt wird.

Mit cmdchat("costume") wird die Funktion, die in die serverCommandList
eingetragen wurde, angesprochen.
Durch "..q.getcurrentquestindex() übergibt den Questindex als Parameter.

Als nächsten sprechen wir den Button als "Event" an.
Mit:
Code:
when button or info begin
Durch den Questindex wurde der Button auf dem GUI dieser Quest zugewiesen.

Als erstes baut man ein Ereignis ein, falls kein Kostüm angelegt ist.
Das siegt dann wie folgt aus:

Code:
if pc.getqf("costume_system_main_active") == 0 
and pc.getqf("costume_system_hair_active") == 0 then return end
Falls die Flags den Wert 0 haben, wird einfach kein Wert zurückgegeben
und der Block wird an dieser Stelle unterbrochen.
Sprich das, was danach kommt, wird nicht mehr ausgeführt.

Als nächstes kommt der Block, in dem definiert wird, was passiert,
wenn ein "Main"-Kostüm (über der Rüstung) angelegt ist.
Dort muss man nur reinschreiben, dass der Mainpart wieder zur Rüstung wechseln soll,
dass man das Kostüm wiederbekommt und das die Flags auf 0 gesetzt werden.

Das sieht dann ca. so aus:
Code:
if pc.getqf("costume_system_main_active") == 1 then
	pc.give_item2(pc.getqf("costume_system_main_vnum"), 1)
	pc.setqf("costume_system_main_active", 0)
	pc.set_part(PART_MAIN, pc.get_armor())
end
pc.set_part() sorgt dafür, dass der "Mainskin" wieder zur Rüstung wechselt.
pc.get_armor() gibt die Vnum der angelegten Rüstung wider.

Zuletzt noch der Teil, was mit den Frisuren passiert.

Dort wird definiert, dass die Frisur zurückgegeben wird,
die eigentliche Frisur gesetzt wird und, dass die Flags auf 0 gesetzt werden.
Das sollte so aussehen:
Code:
if pc.getqf("costume_system_hair_active") == 1 then
	pc.give_item2(pc.getqf("hair_vnum"), 1)
	pc.set_part(PART_HAIR, costume_system_read("part_hair_old"))
	pc.setqf("costume_system_hair_active", 0)
end
Das war's auch schon soweit.
Ich hoffe, ich konnte euch bei der Client-Quest Kommunikation weiterhelfen.
Falls Fragen offen sind, könnt ihr sie mir stellen.

MfG .Remix
Lord iRemix is offline  
Thanks
27 Users
Old 05/29/2013, 19:36   #2
 
.CHHorny's Avatar
 
elite*gold: 168
The Black Market: 146/0/0
Join Date: Feb 2010
Posts: 4,333
Received Thanks: 2,642
Sehr schön und gut nachvollziehbar.
.CHHorny is offline  
Thanks
1 User
Old 05/29/2013, 19:37   #3
 
QuickFlameZ's Avatar
 
elite*gold: 0
Join Date: Mar 2012
Posts: 646
Received Thanks: 696
Sehr locker easy xD
Mfg
QuickFlameZ is offline  
Old 05/29/2013, 19:39   #4
 
[uLow]Beni's Avatar
 
elite*gold: 0
Join Date: May 2011
Posts: 1,781
Received Thanks: 618
Code:
int x = constInfo.Costume
würde vielleicht in c# oder so funktionieren,
aber in python darfst du keinen typ angeben.
also:
Code:
x = constInfo.Costume
[uLow]Beni is offline  
Thanks
2 Users
Old 05/29/2013, 19:40   #5
 
Ʀyuzaki's Avatar
 
elite*gold: 0
Join Date: Sep 2012
Posts: 815
Received Thanks: 627
Sehr gut erklärt
Ʀyuzaki is offline  
Old 05/29/2013, 19:52   #6
 
elite*gold: 252
Join Date: Mar 2008
Posts: 3,111
Received Thanks: 3,912
gab's schon.


Anscheinend hast du eine Schwäche mit der suchfunktion, ist schon das 2. Mal wo du Dinge erklärst, die längst pub sind.

Btw. noch ein Kostümsystemthread?
.Alessa is offline  
Thanks
5 Users
Old 05/29/2013, 19:59   #7

 
elite*gold: 0
Join Date: Mar 2013
Posts: 2,449
Received Thanks: 6,446
Quote:
Originally Posted by .Alessa View Post
gab's schon.


Anscheinend hast du eine Schwäche mit der suchfunktion, ist schon das 2. Mal wo du Dinge erklärst, die längst pub sind.

Btw. noch ein Kostümsystemthread?
Tut mir leid, dass ich für die, die es nicht richtig verstehen, nochmal genauer erkläre.
Wo ist das hier ein Release?
Ist ein Tutorial.
Lord iRemix is offline  
Thanks
2 Users
Old 05/29/2013, 20:09   #8
 
elite*gold: 748
Join Date: Jul 2012
Posts: 1,597
Received Thanks: 1,981
Ehm wer die .msm will, ich habe sie mal angelegt, wer will kann sie beliebig anpassen :P

Attached Files
File Type: rar msm.rar (18.1 KB, 7 views)
.Harlem² is offline  
Old 05/29/2013, 21:29   #9

 
elite*gold: 0
Join Date: Jan 2013
Posts: 348
Received Thanks: 353
Quote:
Originally Posted by .Remix. View Post
Tut mir leid, dass ich für die, die es nicht richtig verstehen, nochmal genauer erkläre.
Wo ist das hier ein Release?
Ist ein Tutorial.
Ich habs nur mal überflogen, aber ich muss .Alessa recht geben, das andere Tutorial ist sehr gut erklärt, da brauch man nicht nochmal ein zweites!

Achtung jetzt kommt es! DAS WAR MEINE MEINUNG!

Objektiv gesehen ist es aber gut erklärt.
TheMarv :< is offline  
Old 05/29/2013, 21:37   #10
 
elite*gold: 0
Join Date: May 2008
Posts: 1,231
Received Thanks: 419
Schön Remix um THEMARVIN einen Gefallen zu tun erweitere ich den Beitrag um eine Zeile
ich finde es sehr schön, dass du diese Methode mit uns teilst, davon kann man viel lernen
yessiя is offline  
Thanks
1 User
Old 05/29/2013, 21:45   #11

 
elite*gold: 0
Join Date: Jan 2013
Posts: 348
Received Thanks: 353
Quote:
Originally Posted by yessiя View Post
Schön Remix
Ich weiße dich, trotz deiner über 1k Beiträge, auf die Regeln hin, die da besagen:
Man soll Posts wie "Gut", "Danke", etc. unterlassen und den Thanks Button drücken!
-Eigenformulierung

Aber keine Sorge, ich glaube an dich!



Mach es wie der Rasenmäher und folge deinem Traum! Du schaffst es! Wir glauben alle an dich!!
TheMarv :< is offline  
Old 05/29/2013, 21:55   #12

 
Mr. 'Avenue™'s Avatar
 
elite*gold: 222
The Black Market: 101/0/0
Join Date: Oct 2012
Posts: 2,369
Received Thanks: 3,389
Quote:
Originally Posted by TheMarv :< View Post
Ich weiße dich, trotz deiner über 1k Beiträge, auf die Regeln hin, die da besagen:
Man soll Posts wie "Gut", "Danke", etc. unterlassen und den Thanks Button drücken!
-Eigenformulierung

Aber keine Sorge, ich glaube an dich!



Mach es wie der Rasenmäher und folge deinem Traum! Du schaffst es! Wir glauben alle an dich!!
Naja, Eigentor, würd' ich sagen, da dies, was du hier von dir gibst (ich meine nur diesen einen Beitrag), gegen die Regeln ist - Spam.
Aus diesem Grund - reported.


.Remix., danke dafür, dass du hier Tutorials für andere User erstellst.
Sind sogar teils sehr gut erklärt, was den Anfängern sicher weiterhilft.

Super Tut! Ich wart' schon auf Questing #3 )
Mr. 'Avenue™ is offline  
Thanks
1 User
Old 05/29/2013, 21:58   #13
 
.Risan.'s Avatar
 
elite*gold: 30
Join Date: Jul 2010
Posts: 1,627
Received Thanks: 1,450
naja.. Diese variante ist doch schon wieder alt...
.Risan. is offline  
Old 05/29/2013, 22:01   #14

 
elite*gold: 0
Join Date: Jan 2013
Posts: 348
Received Thanks: 353
Quote:
Originally Posted by .Avenue™ View Post
Naja, Eigentor, würd' ich sagen, da dies, was du hier von dir gibst (ich meine nur diesen einen Beitrag), gegen die Regeln ist - Spam.
Aus diesem Grund - reported.


.Remix., danke dafür, dass du hier Tutorials für andere User erstellst.
Sind sogar teils sehr gut erklärt, was den Anfängern sicher weiterhilft.

Super Tut! Ich wart' schon auf Questing #3 )
Nein, ich weiße ihn auf die Regeln hin, was erlaubt ist :*

@Risan: Soll ich etwa releasen wie man neue Packets für Client/Quest Kommunikation erstellt? xD
TheMarv :< is offline  
Old 05/29/2013, 22:13   #15
 
elite*gold: 1
Join Date: Apr 2012
Posts: 928
Received Thanks: 2,485
Quote:
Originally Posted by TheMarv :< View Post
Nein, ich weiße ihn auf die Regeln hin, was erlaubt ist :*

@Risan: Soll ich etwa releasen wie man neue Packets für Client/Quest Kommunikation erstellt? xD
Mach halt ?
.Awesoome' is offline  
Thanks
2 Users
Reply

Tags
client quest, guide, lua, python


Similar Threads Similar Threads
[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...
[GUIDE] Python GUI Coding mit SetParent func
04/13/2013 - Metin2 PServer Guides & Strategies - 17 Replies
Heute zeig euch mal wie ihr euch den ganzen mathe kram mit self.PetGUIBG.SetPosition((wndMgr.GetScreenWidth() -345)+130, 245) sparen könnt. Als erstes rendert ihr euer Board das könnt ihr von mir aus noch mit dem self.PetGUIBG.SetPosition((wndMgr.GetScreenWidth() -345)+130, 245) code machen. So wohlt ihr aber jetzt z.B ein Button erstellen. Dann benutzt ihr folgendes: self.Button1.SetParent(self.PetGUIBG) So was bedeutet das eigentlich? Ganz Einfach der Button befindet sich jetzt immer auf...
Metin2 - Python - Wie Python Hacks verschlüsseln und Server überprüfen (GF/PServe)
09/23/2012 - Metin2 - 2 Replies
Ich wollte fragen, wie man Python Hacks am besten Verschlüsselt ? und wie man feststellen kann ob man auf einem GF / Pserver spielt. ?
[Frage]Python tutorial's
05/11/2011 - Metin2 Private Server - 20 Replies
Hey Leute, wie der Titel schon sagt, habe ich eine Frage an euch. Und zwar ob es sich lohnen würde Metin2 Python tutorials zu machen. Stimmt einfach hier in der Umfrage ab. Wenn es ein paar "Ja" Stimmen gibt werde ich mir die mühe machen und tutorials schreiben ;) MfG CranK™



All times are GMT +1. The time now is 07:30.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.