[Guide] Lua/Python Tutorial

05/29/2013 19:34 Lord iRemix#1
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
05/29/2013 19:36 .CHHorny#2
Sehr schön und gut nachvollziehbar.
05/29/2013 19:37 QuickFlameZ#3
Sehr locker easy xD
Mfg
05/29/2013 19:39 [uLow]Beni#4
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
:D
05/29/2013 19:40 Ʀyuzaki#5
Sehr gut erklärt ;)
05/29/2013 19:52 .Alessa#6
gab's schon.
[Only registered and activated users can see links. Click Here To Register...]

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?
[Only registered and activated users can see links. Click Here To Register...]
05/29/2013 19:59 Lord iRemix#7
Quote:
Originally Posted by .Alessa View Post
gab's schon.
[Only registered and activated users can see links. Click Here To Register...]

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?
[Only registered and activated users can see links. Click Here To Register...]
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.
05/29/2013 20:09 .Harlem²#8
Ehm wer die .msm will, ich habe sie mal angelegt, wer will kann sie beliebig anpassen :P

:awesome:
05/29/2013 21:29 TheMarv :<#9
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.
05/29/2013 21:37 yessiя#10
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
05/29/2013 21:45 TheMarv :<#11
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!

[Only registered and activated users can see links. Click Here To Register...]

Mach es wie der Rasenmäher und folge deinem Traum! Du schaffst es! Wir glauben alle an dich!!
05/29/2013 21:55 Mr. 'Avenue™#12
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!

[Only registered and activated users can see links. Click Here To Register...]

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! :D Ich wart' schon auf Questing #3 :))
05/29/2013 21:58 .Risan.#13
naja.. Diese variante ist doch schon wieder alt...
05/29/2013 22:01 TheMarv :<#14
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! :D 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
05/29/2013 22:13 .Awesoome'#15
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 ? :D