
And thanks to plechito, who let me use his server to make a quick test.
Eine Python Klasse fuer die Client Quest Communication.
So richtet ihr mit nur 4 Zeilen die Kommunikation zwischen eurem Client Feature <-> Quest im Clienten ein.
Einfach die Klasse mit "import ClientQuestCommunication" importieren und dann kann man dort drueber alles laufen lassen.
Ein Beispiel findet ihr auch in den Dateien.
Client:
Quest:
Langer Text mit einigen Erklaerungen:
Tutorial fuer das Beispiel:
- schiebt die Datei "ClientQuestCommunication.py" und "uiexample.py" in euer Root Verzeichnis
- fuehrt die Anweisungen der Dateien "constinfo.ADD.py" und "game.add.py" aus
- fuegt die quest auf eurem Server ein und in die locale eintragen
- gegebenfalls folgende Funktionen in der questfunction hinzufuegen:
PHP Code:string.format
string.gsub
cmdchat
- make ausfuehren
- Wichtig: Server restarten!!!1 (sonst wird der neue Quest Index nicht uebernommen)
Standart Quest Kommandos per cmdchat() (siehe SendQuestCommand):
- SET_QUEST_ID(ID)
schickt den Quest Index an den Client. Wird fuer SendQuestCommand() benoetigt. - GET_QUEST_CMD()
ruft den Aktuell zwischengespeicherten Befehl von SendQuestCommand() in der quest ab.
Klassen Methoden:
PHP Code:
SetArgSeperator(seperator)
- setzt das Trennzeichen (seperator)
- standartmaeßig ist es ','
- trennt die empfangenen Argumente von einander
- Beispiel:
Normal werden Argumente in der Quest so verschickt:
cmdchat('EXAMPLE ICH_BIN_EINE_FUNKTION_MIT_3_ARGUMENTEN(1,2,3)')
Gibt man im Client nun an:
SetArgSeperator(':')
wuerden Kommandos nun so mit Argumenten in der Quest verschickt werden:
cmdchat('EXAMPLE ICH_BIN_EINE_FUNKTION_MIT_3_ARGUMENTEN(1:2:3)')
Wird in Quest ausgefuehrt:
cmdchat('EXAMPLE ICH_BIN_EINE_FUNKTION_MIT_3_ARGUMENTEN(1,2,3)')
cmdchat('EXAMPLE ICH_BIN_EINE_FUNKTION_MIT_0_ARGUMENTEN()')
PHP Code:
SetSpaceReplace(replacer)
- ersetzt alle '#' von dem Empfangenen Kommando mit einem Leerzeichen
- standartmaeßig ist es '#'
- Info:
Wenn ein Kommando von der Quest per cmdchat() geschickt wird, darf es keine Leerzeichen in den Argumenten enthalten.
Nur das Leerzeichen nach dem Servercommand.
- Beispiel:
Richtiger cmdchat() in der Quest:
cmdchat("EXAMPLE TEST_FUNCTION(ich#bin#ein#langer#text#mit#leerzeichen.)")
Falscher cmdchat() in der Quest:
cmdchat("EXAMPLE TEST_FUNCTION(ich bin ein langer text mit leerzeichen.)")
Im Client werden dann alle '#' durch Leerzeichen wieder ersetzt.
PHP Code:
ClearTmpCommand()
- loescht den aktuell gespeicherten command manuell.
- hab leider keine Ahnung mehr wozu ich das benutzen wollte, vllt habt ihr ja eine Idee. :p
PHP Code:
EnableChatDebug()
- Sollte nur in der Entwicklung aktiviert werden.
- Aktiviert die Ausgabe von Debugnachrichten im Chat.
PHP Code:
AddCommand(cmd, event)
- Fuegt einen neuen Kommando + sein Event in die Kommandoliste ein.
- Achtung:
Ihr koennt damit auch bereits definierte Kommandos ueberschreiben
- Beispiel Ablauf:
AddCommand('KOMMANDO', funktion1)
def funktion1():
print('funktion1')
Nun steht das Kommando per Quest zum Aufrufen bereit mit:
cmdchat("EXAMPLE KOMMANDO()")
PHP Code:
AddCommandDict(commands)
- nimmt ein Dictionary an
- Fuegt das uebergebene Dictionary an die bereits vorhandenen Kommandos an.
- Achtung:
Ihr koennt damit auch bereits definierte Kommandos ueberschreiben
- Beispiel Ablauf:
commands = {
'KOMMANDO_1' : funktion1,
'KOMMANDO_2' : funktion2,
'KOMMANDO_3' : funktion3
}
AddCommandDict(commands)
def funktion1():
print('funktion1')
def funktion2(var):
print('funktion1 %s '%var)
def funktion3(var1, var2):
print('funktion1 %s %s '%(var1, var2))
Nun stehen die Kommandos per Quest zum Aufrufen bereit mit:
cmdchat("EXAMPLE KOMMANDO_1()")
cmdchat("EXAMPLE KOMMANDO_2(test)")
cmdchat("EXAMPLE KOMMANDO_3(test1,test2)")
PHP Code:
SendQuestCommand(cmd)
- sendet einen Kommando an die Quest.
- Quest Index muss vorher gesetzt werden mit:
cmdchat(string.format("EXAMPLE SET_QUEST_ID(%d)", q.getcurrentquestindex()))
Dies macht man normalerweise beim "when login begin" Quest Trigger
- Beispiel:
SendQuestCommand('TU_ETWAS/var1/va2')
Dies loest nun den Quest Trigger "when button begin" in der Quest aus.
Von dort aus holt man jetzt den zwischengespeicherten Befehl mit:
getinput("EXAMPLE GET_QUEST_CMD()")
die Funktion getinput ist in der example.quest vorhanden.
Ich gehe dann so weiter vor, dass ich den empfangenen String "TU_ETWAS/var1/va2" einfach nach den Zeichen "/" splitte und so die Werte sinnvoll verwenden kann.
PHP Code:
ReceiveQuestCommand(quest_command)
- kommt in die root/game.py serverCommandList und verarbeitet die von der Quest geschickten Kommandos und fuehrt ihre hinterlegten Funktionen aus.
- kann auch aufgeteilte Kommandos entgegennehmen (ungetestet)
- nuetzlich um selbst zu lange Kommandos zu verschicken (kp wo die Grenze war, muesste man nachschauen)
- Beispiel:
Standart Aufbau eines Kommandos:
Ein Kommando beeinhaltet immer den ServerCommand welcher in der game.py unter den ServerCommands definiert wird.
Ein Kommando beeinhaltet immer eine sich oeffnende und schließende runde Klammer "()", da ein abgeschlossener Kommando an der Endklammer erkannt wird.
Die einzelnen Argumente werden (fals nicht anders durch SetArgSeperator() gesetzt) durch ein "," getrennt.
Es darf davor oder danach kein Leerzeichen gesetzt werden.
Die Argumente werden zum Clienten immer als String gesendet.
cmdchat("ServerCommand Kommando(argument1,argument2)")
oder ohne Argumente:
cmdchat("ServerCommand Kommando()")
normaler Kommando:
Kommando von Quest geschickt:
cmdchat("EXAMPLE EXAMPLE_1(test)")
dies kommt dann im Client so an und ruft die hinterlegte Funktion fuer das Kommando EXAMPLE_1 mit dem Argument "test" auf:
ReceiveQuestCommand("EXAMPLE_1(test)")
aufgeteilter Kommando:
Kommando von Quest geschickt:
cmdchat("EXAMPLE EXAMPLE_1(")
cmdchat("hallllllllllllooooooooooooo")
cmdchat("oooooooooo)")
dies wird dann im Client zusammengesetzt und ruft die hinterlegte Funktion fuer das Kommando EXAMPLE_1 mit dem Argument "hallllllllllllooooooooooooooooooooooo" auf:
ReceiveQuestCommand("EXAMPLE_1(hallllllllllllooooooooooooooooooooooo)")
Quote:
Hübsch, aber warum hast ned gleich n Serverside Part dazu gemacht?
hab ne mini Lib zu gebastelt, weil es mir aufn keks gehen würde das zeug jedesmal auszuschreiben
Code:cqc = {} cqc.prefix = "EXAMPLE" cqc.Init = function() cmdchat(string.format(cqc.prefix.." SET_QUEST_ID(%d)", q.getcurrentquestindex()) end cqc.SendRequest = function(request) cmdchat(cqc.prefix.." "..string.gsub(request, " ", "#")) end






