Anfänger: WoW Makro-Konverter StringSplit/Array(?)

  • aaah, jetzt ja. variante 2 ist es, prinzip verstanden! ich sehe aber schon das nächste problem kommen. die makro dateien die ich konvertieren will sind unterschiedlich lang, also sind unterschiedlich viele makros drin gespeichert.
    aber ich hab jetzt schonmal was zum basteln!

    dankeschön :thumbup:

  • Dann lässt du die Schleife, die alles konvertiert, halt so lange durchlaufen, wie die Datei Zeilten hat.
    Das ließt du aus, indem du die Datei öffnest und einfach vll ein Zeichen, was nur 1x die Zeile vorkommt, zählen lässt.

  • Ich möchte dir einfach noch mal zeigen, wie man von dem StringREgExp aus weiterarbeiten kann, daher habe ich folgendes gescriptet:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    ;$sMakros = ClipGet()
    $sMakros = FileRead(@DesktopDir&"\WOW-Makros.txt")

    [/autoit] [autoit][/autoit] [autoit]

    $aMakros = StringRegExp($sMakros, '(?s)(?m)^MACRO\h*(\d+)\h*"(.*?)"\h*(\w+)\v+(.*?)\v+END\b', 3)

    [/autoit] [autoit][/autoit] [autoit]

    ; In ein übersichtliches 2D-Array umsortieren
    Global $iNumberOfMacros = UBound($aMakros)/4
    Global $aMakroArray[$iNumberOfMacros+1][4] = [[$iNumberOfMacros]]
    Global $j = 0
    For $i = 0 To UBound($aMakros)-1 Step 4
    $j += 1
    $aMakroArray[$j][0] = $aMakros[$i]
    $aMakroArray[$j][1] = $aMakros[$i+1]
    $aMakroArray[$j][2] = $aMakros[$i+2]
    $aMakroArray[$j][3] = $aMakros[$i+3]
    Next
    ; sortieren Ende

    [/autoit] [autoit][/autoit] [autoit]

    $aMakros = 0 ; wird nicht mehr benötigt, alles ist jetzt in $aMakroArray

    [/autoit] [autoit][/autoit] [autoit]

    ; Anzeigen
    _ArrayDisplay($aMakroArray)

    [/autoit] [autoit][/autoit] [autoit]

    ; Schreiben
    Global $hFile = FileOpen(@DesktopDir & "\test.txt", 2)
    For $i = 1 To $iNumberOfMacros
    FileWrite($hFile, "Name: " & $aMakroArray[$i][1] & @CRLF)
    FileWrite($hFile, "Icon: " & $aMakroArray[$i][2] & @CRLF)
    FileWrite($hFile, "Befehle: " & @CRLF & $aMakroArray[$i][3] & @CRLF)
    FileWrite($hFile, @CRLF)
    Next
    FileClose($hFile)

    [/autoit] [autoit][/autoit] [autoit]

    ; Datei öffnen
    ShellExecute(@DesktopDir & "\makroausgabe.txt")

    [/autoit]
  • vielen dank an alle, hier kriegt man echt geholfen! heute abend und morgen gehts weiter.
    wieder bisschen was dazu gelernt.

  • da bin ich wieder!
    ich hoffe ihr könnt nochmal helfen, ist gar nicht mehr so viel zu machen...
    also, im prinzip hat das schon ganz gut geklappt. ich konnte testweise makros in das gewünschte format bringen.
    dabei sind aber, wie sollte es anders sein, einige problemchen aufgetaucht.
    das script nach progandy:

    Spoiler anzeigen


    ich habe es stark gekürzt da es immer das gleiche ist und habe da kommentare geschrieben auf die ich mich jetzt beziehe. das ganz oben soll einmalig am anfang der ausgabedatei reingeschrieben werden. da ich nicht weis wie es besser geht, öffne/schreibe ich halt 2 mal die datei wie ihr seht. naja, geht schon aber jetzt zu den eigentlichen problemen:
    mit einzeiligen makros klappt alles aber bei mehrzeiligen nicht, diese müssen so aussehen:

    Spoiler anzeigen
    Code
    ["macro"] = "/use Räucherschinkensteak\n/use Hammelkoteletts\n/use Stoppelfühlerwels",


    es muß also innerhalb eines mehrzeiligen makros hinter jede zeile ein \n gesetzt werden. wie kann ich das jetzt noch weiter splitten um überall /n einzufügen und wie krieg ich das dann wieder zusammen?

    nächste sache ist, ganz am ende der datei muß diese mit mehreren } geschlossen werden, siehe ganz unten im script. im block darüber dürfen ganz am ende der datei aber die beiden { dann nicht geschrieben werden. die beiden { werden aber gebraucht, nur ganz am ende der datei dürfen sie halt nicht stehen.

    und zu guter letzt:
    die icons zu den makros sind in der macro-cache.txt datei von wow als name hinterlegt. beispiel: Spell_ChargeNegative. in der config datei vom addon werden aber nicht die namen, sondern nummern verwendet. welches icon welche nummer hat weis ich, nur weis ich nicht wie man damit arbeitet. macht man das mit einer .ini datei oder was würde sich hier anbieten? brauche ja eine art datenbank wo drin steht Spell_ChargeNegative = 1 usw.

    ist gar nicht so einfach für mich, erstmal drüber schlafen... :sleeping:

  • Zu dem letzten Punkt:

    Richtig.
    Inidatei mit den Daten,

    [autoit]


    IniWrite("nummern.ini", "Nummern", "Key", "Value")

    [/autoit]


    Wenn du das ausführst, machst du dir eine Ini.
    Dieses Ding erweiterst du dann am besten in genau dem Stil, wo du dann als Key das eingibst, was du suchst und als Value, was er damit ersetzen soll.


    [autoit]


    $nummern = IniReadSection("nummer.ini", "Nummern")

    [/autoit]


    Damit ließt du halt die Sektion ein. 1x an den Anfang reicht.
    Hast dann 2D Array.

    Und zwar wie folgt:

    [autoit]

    $nummern[0][0]

    [/autoit]

    Die erste 0 ist die Zahl, die du links suchst. die zweite 0 ist der Value-Wert.

    Speicherst halt die Zahl, von der du das Icon brauchst, in ne Variable.

    Das Ding rufst du dann halt auf mit:

    [autoit]

    $nummern[$variable][1]

    [/autoit]


    Und dann hast auch den Text.

  • Zitat

    brauche ja eine art datenbank wo drin steht Spell_ChargeNegative = 1 usw.


    Ja da bietet sich eine ini an. ;)
    Du kannst dann mit StringReplace die Namen durch ihre entsprechenden Nummern ersetzen.

    Zitat

    es muß also innerhalb eines mehrzeiligen makros hinter jede zeile ein \n gesetzt werden. wie kann ich das jetzt noch weiter splitten um überall /n einzufügen und wie krieg ich das dann wieder zusammen?


    Mit

    Spoiler anzeigen
    [autoit]

    $aResult = StringSplit($sSpell, "/", 2)
    $sSpell = ""
    For $i = 0 To UBound($aResult) -1
    $sSpell &= "/" & $aResult[$i] & "\n"
    Next
    $sSpell = StringTrimRight($sSpell, 2)

    [/autoit]
  • Um die mehrzeiligen Makros in eine Zeile zu schreiben, bietet sich folgendes an:

    [autoit]

    $alt = "/blub test" & @CRLF & "/nochwas"

    [/autoit][autoit][/autoit][autoit]

    $neu = StringReplace(StringStripCR($alt), @LF, "\n") ; @CR entfernen, dann @LF mit \n ersetzen

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, '', "----ALT----" & @CRLF & _
    $alt & _
    @CRLF & "----NEU-----" & @CRLF & _
    $neu)

    [/autoit]
  • [autoit]


    IniWrite("nummern.ini", "Nummern", "Key", "Value")

    [/autoit]


    Wenn du das ausführst, machst du dir eine Ini.
    Dieses Ding erweiterst du dann am besten in genau dem Stil, wo du dann als Key das eingibst, was du suchst und als Value, was er damit ersetzen soll.
    [autoit]

    problem dabei ist das es über 1000 werte(icons) sind, ich kann sie also nicht von hand eintragen.
    die icons liegen in einem ordner, sind alphabetisch sortiert und sollen so wie sie sind durchnummeriert werden.
    ich habe testweise folgendes gemacht:

    Code
    #Include <File.au3>
    $FileList=_FileListToArray("E:\WoW\Blizzard Interface Art (deDE)\Icons")
     _FileWriteFromArray(@ScriptDir & '\DB.txt', $FileList)


    das erstellt mir eine liste der icons von a-z von dem angegebenen ordner. diese liste muss jetzt noch fortlaufende nummern erhalten(1 - ca.1000) für jeden eintrag. am besten sollte das gleich als ini geschrieben werden.
    sollte dann so aussehen:

    Code
    [IconID]
    IconA=1
    IconB=2
    IconC=3


    die icons an sich brauche ich nicht, nur den text für die datenbank damit definiert ist welches icon welche nummer hat.

    das mit den mehrzeiligen makros hab ich auch noch nicht hingekriegt,d.h ich konnte es nicht ins script einbauen das es funktioniert. ich versuche es nachher nochmal.

  • danke, hat funktioniert! habe jetzt meine ini und versuche mit StringReplace den icontext durch die zahl zu ersetzten. irgendwie klappt das nicht... mal pause machen, später check ichs vielleicht.

  • ich kriegs einfach nicht hin mit den icons. hat jemand mal ein beispiel wie man korrekt text ersetzt mit den werten aus einer ini? ich hab schon zig threads gelesen aber nicht das richtige gefunden.

  • Hier mal ein Beispiel mit dem ersetzen:

    Spoiler anzeigen
    [autoit]

    $aReplace = IniReadSection("Replace.ini", "Replace")

    [/autoit] [autoit][/autoit] [autoit]

    $sString = "IconA;IconB;IconC;IconD;IconE;"
    MsgBox(0,"",$sString)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aReplace[0][0]
    $sString = StringReplace($sString, $aReplace[$i][0], $aReplace[$i][1])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"",$sString)

    [/autoit]


    Inhalt der ini (Beispiel)

    Code
    [Replace]
    IconA=12
    IconB=14
    IconC=1
    IconD=5
    IconE=9
  • danke nochmals! ich habe es mehrmals so versucht, allerdings hatte ich mir einen kleinen fehler eingebaut. jetzt geht es, nur die sache mit den mehrzeiligen makros macht noch probleme. habe die beiden genannten beispiele getestet und leider ist es doch nicht ganz so einfach. beide scripts setzen mir vor jedes / ein \n. das ist aber nicht ganz richtig so, vor dem ersten / darf kein \n stehen.
    wenn ich den code von progandy verwende geht zusätzlich die formatierung der datei verloren.
    so sollte es aussehen:

    Code
    /use Räucherschinkensteak\n/use Hammelkoteletts\n/use Stoppelfühlerwels


    so sieht es aus:

    Code
    \n/use Räucherschinkensteak\n/use Hammelkoteletts\n/use Stoppelfühlerwels


    ich habe das ganz am ende eingebaut, wenn bereits alles ersetzt und geschrieben wurde. leider werden aber dann alle makros um ein \n ergänzt, nicht nur die mehrzeiligen. morgen nochmal schauen, ist bestimmt ganz einfach...