[HowTo] einfachen Valvuesearcher erstellen

01/27/2012 15:41 xShizoidx#1
Guten Tag,

in diesem Tutorial werde ich euch einmal erklären , wie ihr ganz einfach einen Valvuesearcher erstellen könnt. Als Programmiersprache verwende ich Autoit.
Gewisse Grundkenntnisse in Autoit sind für dieses Tutorial erforderlich.

1.) Erstellung einer GUI für den Valvuesearcher

Zuerstmal einmal solltet ihr euch eine GUI für den Valvuesearcher erstellen, dazu könnt ihr den Koda Form Designer benutzen.
So sieht meine GUI aus, damit ihr weißt, wie ihr es ungefähr machen könnt :
Code:
#include <ButtonConstants.au3> 
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
$GUI = GUICreate("ValvueSearcher", 272, 106, 192, 124) 
$LabelSuche = GUICtrlCreateLabel("Suchen", 8, 12, 40, 17)
$InputSuche = GUICtrlCreateInput("", 60, 8, 209, 21)
$LabelValvue = GUICtrlCreateLabel("Valvue", 8, 44, 37, 17)
$Edit1 = GUICtrlCreateEdit("", 60, 40, 209, 21, BitOR($ES_READONLY,$ES_WANTRETURN))
$Suchen = GUICtrlCreateButton("Suchen", 184, 72, 75, 25)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
2.) Grundskript fertigstellen

Nun müssen wir es erstmal so schreiben, dass wenn ein Name angegeben wird, in der Editbox auch die passende Valvue erscheint. Ich habe es mal so geschrieben :
Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
$GUI = GUICreate("ValvueSearcher", 272, 106, 192, 124)
$LabelSuche = GUICtrlCreateLabel("Suchen", 8, 12, 40, 17)
$InputSuche = GUICtrlCreateInput("", 60, 8, 209, 21)
$LabelValvue = GUICtrlCreateLabel("Valvue", 8, 44, 37, 17)
$Edit1 = GUICtrlCreateEdit("", 60, 40, 209, 21, BitOR($ES_READONLY,$ES_WANTRETURN))
$Suchen = GUICtrlCreateButton("Suchen", 184, 72, 75, 25)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Suchen
			Switch (GuiCtrlRead($InputSuche))
				Case "Schwert" ; Wenn in der Inputbox bei Suche Schwert gelesen wird, dann ...
					GuiCtrlSetData($Edit1,"1") ; Wird in die Editbox die Zahl 1 geschrieben, welches die Valvue darstellen soll
			EndSwitch
	EndSwitch
WEnd
So wird es nachher mit allen Namen und Valvues ablaufen.

3.) Valvues und Namen aus der Item_proto filtern

Wer nun denkt, dass er jede einzelne Valvue und jeden Name selber eintragen muss im Skript, der liegt da total falsch, da wird uns die Arbeit einfach ersparen können, indem wir die Informationen aus der Item_proto.xml
aus einem beliebigen Clienten ziehen können, wobei wir vorher die .epk und .eix entpacken müssen um an die Item_proto zu kommen und diese dann auch weiter zu entpacken.
So, dann haben wir nun die Item_proto entpackt und öffnen mal die item_proto.xml.
Hier mal eine Zeile aus der Item_proto.xml :
Code:
<Item vnum="10" hashName="'µµ+0'" name="Schwert+0" type="1" subtype="0" weight="0" size="2" antiflag="32" flag="1" wearflag="16" immuneflag="0" gold="0" buy_price="0" limittype0="1" limitvalue0="0" limittype1="0" limitvalue1="0" applytype0="7" applyvalue0="22" applytype1="0" applyvalue1="0" applytype2="0" applyvalue2="0" value0="0" value1="15" value2="19" value3="13" value4="15" value5="0" socket0="0" socket1="64992" socket2="127" socket3="64976" socket4="21631" socket5="4855" refine_vnum="11" refine_set="1" magic_pct="15" specular="0" socket_pct="1" />
Wir wir nun sehen befindet sich zwischen einem dem Text name=" und dem nächsten " der Itemname und die Valvue befindet sich zwischen <Item vnum=" und dem nächsten ". Diese Namen und die Valvues werden wir gleich mit einem zweiten Skript auslesen und dieses so in eine Textdatei schreiben, dass er quasi schon den Autoit Code für uns ausspuckt.
Hier einmal der Code mit Erklärung, wo die .xml durchgelesen werden, die Namen und Valvues rausgefiltert werden und als Autoit Code in eine Textdatei geschrieben werden.
Code:
#include <String.au3>
#include <File.au3>
FileOpen(@ScriptDir & "\Source.txt",2) ; Source.txt wird geöffnet im Schreibmodus
FileOpen(@ScriptDir & "\item_proto_dump.xml") ; item_proto_dump.xml wird im Lesemodus geöffnet
$LCount = _FileCountLines(@ScriptDir & "\item_proto_dump.xml") ; Es wird ermittelt, wieviele Zeilen die item_proto_dump.xml hat
For $i = 1 To $LCount ; For Schleife $i hat den Wert 1 und bei jeder For Schleife erhöht sich der Wert von $i um 1, bis die Anzahl der Zeilen erreicht wurde
	$ReadLine = FileReadLine(@ScriptDir & "\item_proto_dump.xml", $i) ; Bestimmte Zeile wird ausgelesen
	If StringInStr($ReadLine, 'name="') Then ; Wenn name=" sich im ausgelesenen Zeilentext befindet, dann ...
		$Name = _StringBetween($ReadLine, 'name="', '"',1) ; Name wird herausgefiltert
		$Valvue = _StringBetween($ReadLine, '<Item vnum="', '"',1) ; Valvue wird herausgefiltert
		FileWrite("Source.txt",'case "' &  $Name[0] & '"' & @CRLF) ; Schreibt Autoit Code in Textdatei ..
		FileWrite("Source.txt",'GuiCtrlSetData($Edit1,"' & $Valvue[0] & '")' & @CRLF) ; Schreibt Autoit Code in Textdatei ..
	EndIf ; Ende der If Schleife
Next ; Ende der Schleife
FileClose(@ScriptDir & "\Source.txt") ; Schließt die Source.txt
FileClose(@ScriptDir & "\item_proto_dump.xml") ; Schließt die item_proto_dump.xml wieder
$Edit1 muss noch zu eurer Control ID angepasst werden, falls ihr eine andere habt !
So, nun packt ihr die item_proto_dump.xml in den Ordner, worin sich dieses Script befindet und startest das Skript. Nun dauert es einen Moment und ihr werdet dann sehen, dass die Infos herausgefiltert und als Code in eure Source.txt geschrieben wurden.
So sieht es bei mir in der Source.txt aus :
Code:
case "Yang"
GuiCtrlSetData($Edit1,"1")
case "Deutsche Version"
GuiCtrlSetData($Edit1,"2")
case "Schwert+0"
GuiCtrlSetData($Edit1,"10")
case "Schwert+1"
GuiCtrlSetData($Edit1,"11")
case "Schwert+2"
GuiCtrlSetData($Edit1,"12")
case "Schwert+3"
GuiCtrlSetData($Edit1,"13")
case "Schwert+4"
GuiCtrlSetData($Edit1,"14")
case "Schwert+5"
GuiCtrlSetData($Edit1,"15")
case "Schwert+6"
GuiCtrlSetData($Edit1,"16")
case "Schwert+7"
GuiCtrlSetData($Edit1,"17")
....
4.) Autoit Code, worin sich auch die Valvues + Itemnamen befinden in Skript einbinden

Ja, nun müsst ihr den Inhalt der Source.txt noch in euer Skript einfügen, niemlich direkt nach dem " Switch (GuiCtrlRead($Edit1)) ", falls ihr mein Skript benutzt.
So sollte es dann bei euch ca. aussehen :
Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
$GUI = GUICreate("ValvueSearcher", 272, 106, 192, 124)
$LabelSuche = GUICtrlCreateLabel("Suchen", 8, 12, 40, 17)
$InputSuche = GUICtrlCreateInput("", 60, 8, 209, 21)
$LabelValvue = GUICtrlCreateLabel("Valvue", 8, 44, 37, 17)
$Edit1 = GUICtrlCreateEdit("", 60, 40, 209, 21, BitOR($ES_READONLY,$ES_WANTRETURN))
$Suchen = GUICtrlCreateButton("Suchen", 184, 72, 75, 25)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Suchen
			Switch (GuiCtrlRead($InputSuche))
				case "Yang"
GuiCtrlSetData($Edit1,"1")
case "Deutsche Version"
GuiCtrlSetData($Edit1,"2")
case "Schwert+0"
GuiCtrlSetData($Edit1,"10")
case "Schwert+1"
GuiCtrlSetData($Edit1,"11")
case "Schwert+2"
GuiCtrlSetData($Edit1,"12")
case "Schwert+3"
GuiCtrlSetData($Edit1,"13")
; ..... und so weiter
			EndSwitch
	EndSwitch
WEnd
Und schon ist der Valvuesearcher ohne großen Aufwand fertig. Ich habe euch als Anhang nochmal mein Valvuesearcher mit Source rangehangen, damit ihr euch es anschauen könnt. < wenn ihr dort z.b. Schwert+1 bei Suche eingibt, dann erscheint darunter die Valvue.
01/27/2012 17:24 Stamm1994#2
nice gefällt mir :)
02/06/2012 23:26 Spearfist#3
Sehr schön Danke
Echt klasse von dir, wird AutoIt einsteigern sicherlich
helfen.
Gruß Spearfist
02/07/2012 10:05 Mashkin#4
Allein der Richtigkeit zuliebe möchte ich dich darauf hinweisen, dass es nicht "Valvues" sondern "Values" heißt, was zu deutsch "Werte" bedeutet.

Ansonsten kann ich zwar überhaupt nichts damit anfangen, aber ich kann mir vorstellen, dass es den einen oder anderen interessiert.
02/07/2012 17:00 exi°#5
Sehr praktisch.
02/07/2012 17:23 xShizoidx#6
Danke für eure Kommentare.

Das ganze könnte man natürlich auch verkürzen, z.B. so :

Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
$GUI = GUICreate("ValvueSearcher", 272, 106, 192, 124)
$LabelSuche = GUICtrlCreateLabel("Suchen", 8, 12, 40, 17)
$InputSuche = GUICtrlCreateInput("", 60, 8, 209, 21)
$LabelValvue = GUICtrlCreateLabel("Value", 8, 44, 37, 17)
$Edit1 = GUICtrlCreateEdit("", 60, 40, 209, 21, BitOR($ES_READONLY,$ES_WANTRETURN))
$Suchen = GUICtrlCreateButton("Suchen", 184, 72, 75, 25)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Suchen
$Items = StringSplit ("Schwert+0|Schwert+1|Schwert+2|Schwert+3","|") ; ....
$Values = StringSplit ("10|11|12|13","|") ; ....
For $i = 1 to $Items[0]
	If GuiCtrlRead($Inputsuche) = $Items[$i] Then
		GuiCtrlSetData($Edit1,$Values[$i])
	EndIf
Next
	EndSwitch
WEnd
So haben wir nachher nur 6 Zeilen anstatt mehrere tausende Zeilen, wobei dies eigentlich auch kein Unterschied macht, außer dass die Datei nachher nicht so groß ist. Es gibt auch noch andere Methoden zum verkürzen, dies ist also nur ein Beispiel, wie man es machen könnte.