Probleme mit Arrays

  • Hallo erst einmal an alle,
    ich habe vor 2 Wochen angefangen mit mit autoit zu beschäftigen.Nun stehe ich aber vor meinem ersten Problem

    Ich zocke Rift (MMO-Game) - und nein, ich habe nicht vor einen Bot zu bauen, sondern nur eine Auswertung für mich ;)

    Wenn ich dort Materialien abbaue, wird das alles in eine Log geschrieben mit folgendem Aufbau

    Spoiler anzeigen

    21:37:02: xxx hat 0 SEP erhalten
    21:37:03: Ihr erhaltet: Aventurin x 4
    21:37:04: Ihr erhaltet: [Thalasiterz]
    21:37:04: Ihr erhaltet: [Thalasit-Kristall]
    21:37:04: Ihr erhaltet: [Funkelblatt] x 4
    21:37:06: yyy hat 0 SEP erhalten
    21:37:06: Ihr erhaltet: Aventurin x 10
    21:37:09: Ihr erhaltet: [Kleiner 5-Sterne-Dimensionsvorrat]
    21:37:11: yyy hat 0 SEP erhalten
    21:37:11: Ihr erhaltet: Aventurin x 12
    21:37:14: Ihr erhaltet: [Zuckerstange]
    21:39:28: [yyy] hat Folgendes hergestellt: [Nebulöse Träume]!
    21:39:59: Protokoll außerhalb von Kämpfen aktiviert.
    21:42:29: *[yyy] winkt Heneth zu.*
    21:42:43: *[yyy] winkt yyy freundlich zu.*
    21:44:59: [9. Stufe 65][Volturnus@Gelidra]: <Skins on Farm> Infophone: New T3 Skin (1H Sword) in Vault 2! Please note guild vaults are locked from Feb5 to Feb29! Cheers - Volt
    21:47:33: [yyy] hat Folgendes hergestellt: [Geläuterter Albtraum]!
    21:48:07: yyy hat 0 SEP erhalten

    Mich interessieren aber nur die Zeilen, in welchen "Ihr erhaltet:" vorkommt. Weiter möchte ich erreichen, daß nur in meiner Auswertung steht, was ich erhalten habe, also z.B. "[Funkelblatt] x 4". Das habe ich auch schon soweit geschafft. Allerdings wird das eine ellenlange Liste, da er alles mehrmals rein schreibt. Meine Idee war jetzt folgende:

    Hiermit bekomme ich ein Array, in welchem zuerst nur ausgegeben wird, was ich erhalten habe (also restlicher Mist raus) und ein Array in dem ich die erhaltene Anzahl an Materialien gesplittet habe.

    screen1.png screen2.png


    Mein Problem ist jetzt, daß ich in func f2() die Arrays, welche ich in func f1() erstellt habe nicht angezeigt bekomme. <- Gelöst (Funktionsaufruf f2() war nach next)
    Ich wollte zu Lernzwecken versuchen in einer extra Funktion die [ ] aus den Arrays zu bekomen.

    Und noch eine Frage hätte ich, ist es möglich wenn im 2. Array mehrmals z.B. Funkelblatt x 2, Funkelblatt x 4 etc steht, alles auf eine Zeile zu bekommen und die Multiplikatoren zusammen addiert?

    Wie gesagt, ich beschäftige mich erst seit 2 Wochen mit autoit...

    • Offizieller Beitrag

    Poste mal eine Beispielsdate deiner Daten, mit denen man testen kann.
    Damit meine ich deine log.txt Datei.

  • Moin,

    Ich will hier nicht flamen, sondern nur eigene Erfahrung (die ich erst kürzlich gemacht habe) teilen. Ich durfte für ein anderes MMO (Aura Kingdom) nichtmal eine Uhr die mir Events im Spiel die zu bestimmten Zeiträumen auftreten anzeigt herstellen. Ich hatte vorher selbstversträndlich die AGBs gelesen und nichts anstößiges gefunden, weiterhin hat mein Programm in keinster Weise auf irgendwelche Dateien des spiels zugegriffen, oder irgendetwas im Spiel angezeigt. Es war nur ein einfaches Windowsfenster das anzeigen konnte wann das nächste Event startet. Von einem GameMaster habe ich gehört, dass mein Acc gesperrt wird, wenn ich dieses Tool nicht sofort aus dem Internetz nehme, warum konnte mir aber leider nicht gesagt werden (der GM selbst wusste nicht gegen was für Regeln ich verstoße, er hat die Sache auch nur an irgendwen weitergeleitet).

    Daher mein Rat: Frage nach ob du das was du vorhast überhaupt darfst, MMO Entwickler/Publisher fackeln nicht lange, da wird man beim kleinsten Vorfall (selbst wenn niemand versteht was daran nun ein Verstoß sein soll) direkt getötet. Nimm bitte auch die Namen deiner Gruppenmitglieder aus dem Startpost raus.

    Edit: Gerade bei Rift habe ich gehört, dass man bereits gebannt wird, wenn man sich negativ über Dev's, sonstige Teammitglieder, p2w, und alles was denen nicht in den Kram passt äußert.

    Edit2: Versuche Anonym zu fragen ohne Verweis auf diesen Thread. Wenn du weißt ob du es darfst, dann kann man sich hier darum kümmern. Falls dem nicht so ist wird es hier keinen Support geben. Wir haben auch unsere Regeln ;)

    lg
    M

  • Ich habe das erste Problem, weshalb mir in func f2 die Arrays nicht angezeigt wurden gelöst. Der Funktionsaufruf f2() ist mir eine Zeile zu tief gerutscht. Sollte vor dem "Next" stehen, nicht danach.

    @Mars
    Ich bin gerade in Rift online und habe mich mit einem GM unterhalten.
    Zitat: Mit deinen lokalen Daten kannst du machen was du möchtest, solange dadurch kein Eingriff in das Spiel genommen wird. Zitatende

    Ich spiele hier mit meinen Kidd's zusammen und wir möchten ja nur für uns eine Auswertung, wer wie viele Materialien gesammelt hat. Es greift also NICHT auf das Spiel zu und ist damit in Ordnung. Im übrigens bin ich selbst gegen "Bot's", falls es darauf abzielt. Wo bleibt der Spielspass, wenn man irgendwelche Funktionen durch Programme abnehmen lässt? Werde ich nie verstehen... ;)

    PS: Ich habe die Namen sowohl im Thread, wie auch in der angehängten datei mit yyy ersetzt

    Einmal editiert, zuletzt von thewanderer (5. Februar 2016 um 21:20)

  • Wo bleibt der Spielspass, wenn man irgendwelche Funktionen durch Programme abnehmen lässt? Werde ich nie verstehen...

    Genau wie neim spielen im RL auch: wenn du Spass haben und andere abzocken willst musst du in der Lage sein deine Statistik nebenbei im Kopf zu führen.
    Und damit du weiter Spass hast solltest du dies trainieren und nicht outsourcen.

    Falls du dein Wissen in AutoIt verbessern willst: 2 Wochen sollten reichen um eine (wenn auch nicht unbedingt die beste) Lösung zu finden. Und eine gute Übung ist es außerdem. Solange du nicht selbst einen Versuch der Lösung postest, schlage ich Spasses halber 1) und zu Lernzwecken 2) vor: Niemand supported dieses Thema bis dahin.

    1) wir wollen dir ja nich deinen Spass nehmen.
    2) probieren und selbst testen ist mehr wert als etwas vorgekautes zu verwenden.

    2 Mal editiert, zuletzt von autoBert (6. Februar 2016 um 01:04)

  • Selbverständlich bin ich dabei selbst eine Lösung zu finden. Das erste Problem habe ich ja auch schon gelöst. Ich möchte hier kein fertiges Skript von euch haben, sondern hatte lediglich Fragen gestellt.

    Zitat: Und noch eine Frage hätte ich, ist es möglich wenn im 2. Array mehrmals z.B. Funkelblatt x 2, Funkelblatt x 4 etc steht, alles auf eine Zeile zu bekommen und die Multiplikatoren zusammen addiert?

    Aber wenn es zu viel verlangt ist, einfach nur eine Antwort zu geben und stattdessen dumme Sprüche zu schwingen, bin ich hier warscheinlich falsch. Dann würde ich das Forenthema auch nicht "Hilfe & Unterstützung" nennen !!!

    • Offizieller Beitrag

    Ich sehe kein Problem darin eine Lokale Datei für sich selbst aufzubereiten. Für mich hat das keinerlei Einfluss auf das Spiel.
    Hier mal mein Lösungsansatz, bin schon ein bisschen eingrostet, weil ich ewig nix mehr in AutoIt gemacht habe.

    Spoiler anzeigen

    Achte bitte darauf, das man in Funktionen keine Globalen Variablen erstellen sollte. Das kann dir viel Ärger bereiten.

    Edit: Um deine Fragen zu beantworten, du kannst dein Array mit _ArrayUnique filtern, damit mehrfachaufkommen aussotiert werden.
    Wie man dann die Vorkommen zusammenzählt kannst du in meinem Script sehen, hab es jetzt extra nicht kommentiert damit du dich
    damit auseinandersetzen musst :D
    Wenn du dich fragen solltest, warum ich StringStripWS benutzt habe, lasse das ganze mal weg und sieh dir das Resultat deiner Beispielsdatei genau an ;)

  • Man wird ja wohl noch etwas diskutieren dürfen :P
    Manchmal ist es schon okay, dass ein bisschen geschwätzt wird, wir sind schließlich keine Roboter die mit einem Input ohne irgendwas zu sagen direkt einen Output liefern.

    Hier meine Lösung, leider habe ich einen anderen Programmierstil und daher die komplette Funktion nochmal geschrieben... ohne ArrayUnique, ohne RegEx., ohne Zauberei.

    lg

    M

    • Offizieller Beitrag
    Zitat von Mars

    Man wird ja wohl noch etwas diskutieren dürfen
    Manchmal ist es schon okay, dass ein bisschen geschwätzt wird, wir sind schließlich keine Roboter die mit einem Input ohne irgendwas zu sagen direkt einen Output liefern.

    Wer hat behauptet, das man nicht diskutieren darf? X/

    Btw, stelle ich gerade fest, das der Highlighter nich nur probleme mit den Kommentaren hat, sondern vollkommen unzureichend ist. UDF Befehle werden nicht eingefärbt. Da werde ich mich doch irgendwann mal dran machen müssen und versuchen das zu ändern
    :whistling:
    Obwohl ich nicht verstehe warum das so ist, die Keywords sind im Highlighter enthalten, hab nur keine Ahnung ob und wie Gun-Food das eingebunden hat.

  • Ich sehe kein Problem darin eine Lokale Datei für sich selbst aufzubereiten. Für mich hat das keinerlei Einfluss auf das Spiel.

    Hab ich auch kein Problem damit, war ja auch nur ein Vorschlag um ihm den Spass und Erfolg nicht zu verderben, < 2 Std. Suche im Entwicklerforum und er hätte gute Vorlagen (afair Melba) gefunden, sprich er könnte selbst schon fertig damit sein.

    Edit: deine Lösung wirft bei mir einen Fehler in der array.au3 (_ArrayUnique) muß ich wohl neu installieren.

    noch ne andere Lösung

    mfg autoBert

    2 Mal editiert, zuletzt von autoBert (6. Februar 2016 um 11:49)

    • Offizieller Beitrag

    @autoBert, warum hast du deinen letzten Beitrag deaktiviert?

  • Vielen Dank für eure Hilfe,
    da sieht man mal, dass meine Denkweise viel zu kompliziert ist. Eure Skripte sind nicht mal annähernd so lang wie meine.
    Klar lernt man durch probieren am besten, deshalb hab ich mich ja auch selbst über eine Lösung gemacht. Ich benutz auch nicht eure Skripte einfach so, weil ich verstehen will, was da vor sich geht, deshalb hab ich auch gleich noch ein paar Fragen. Ich finde es auch sehr gut, dass ich verschiedene Programmierstile von euch sehe, nach dem Motto - viele Wege führen nach Rom.


    @Mars
    ist die Zeile 6 "_ArrayDisplay($aLog)" nötig? so wie ich das sehe, wird $aLog im ganzen Skript nicht mehr verwendet
    Kannst du mir sagen, warum du bei der ersten Schleife (Zeile 14) am Logende anfängst und Rückwärts zählst?

    @autoBert ich bekomme bei der Funktion "_ArrayColInsert($aResult_u,1)" einen Error - undefined function. Mach ich da was falsch? Kann in der Hilfe die Funktion auch nicht finden.

  • Das _ArrayDisplay ist natürlich völlig unnötig, es ist nur um das fertige Array anzuzeigen.

    Das Skript funktioniert so:
    1. Include Array -> Damit werden Arrayfunktionen wie _ArrayDisplay, _ArraySort, usw freigeschaltet
    3. $sRead = FileRead(Hier den Pfad zur Logdatei eingeben) -> In der Variable $sRead steht nun der Inhalt der Logdatei als String
    4. $aLog = LogToArray($sRead) -> Wandelt den String in ein Array um (Das müsste das Array sein, das du haben wolltest)
    6. _ArrayDisplay($aLog) -> Zeigt das fertige Array an
    8. Funktionsbeginn der Funktion die aus dem String das Array macht
    29. Optionales Sortieren -> Dmit ist das Item was am häufigsten gefunden wurde an Stelle 1. Kann aber auskommentiert werden, wenn man es nicht sortiert haben möchte.
    10, 20, 21. Rückwärts Loop -> Dadurch ist es wesentlich einfacher Arrayelemente zu löschen. Beim Löschen wird die Arraygröße um 1 verringert, sodass man nicht mehr zum vorherbestimmten Ende des Arrays durchlaufen kann (In dem Fall müsste man den Index manuell um 1 verringern, oder die Schleife neu starten). Läuft man aber Rückwärts werden nur Elemente gelöscht die man sowieso nicht mehr besucht hätte, sodass man sich Sonderfälle und Ausnahmen schenken kann.

    Edit: Villeicht liest du dir https://www.autoitscript.com/wiki/Best_coding_practices durch. Da ist eine Liste der Prefixe die man üblicherweise in AutoIt verwendet (das ist kein muss, erleichtert aber sich im Skript zurechtzufinden. z.B. ist $sRead -> s + Read -> s = String + Read = Variablenname oder aLog -> a + Log -> a = Array + Log = Variablenname)

    Edit2:

    @autoBert, warum hast du deinen letzten Beitrag deaktiviert?

    Weil er es kann :D

    lg
    M

  • @autoBert, warum hast du deinen letzten Beitrag deaktiviert?

    Ergebnis ist noch nicht überprüft. Übrigens differerieren alle 3 Ergebnisse: die von Mars und meine stimmen weitgehend überein. Differenz liegt bei Mars:

    Code
    [Thalasiterz] |2
    [Thalasiterz]|2
    [Durchsichtiger Stoff] |3
    [Durchsichtiger Stoff]|1

    Diese noch zusammengefasst stimmen sie mit meinen Summen überein.

    @autoBert ich bekomme bei der Funktion "_ArrayColInsert($aResult_u,1)" einen Error - undefined function. Mach ich da was falsch? Kann in der Hilfe die Funktion auch nicht finden.

    du benutzt noch nicht 3.3.14.x Wann genau diese Funktion hinzugefügt wurde weiß ich nicht ab 3.3.14.1 ist sie aber definitiv enthalten.

    Einmal editiert, zuletzt von autoBert (6. Februar 2016 um 12:14)

  • Oh... da habe ich nicht drauf geachtet... Habe nicht bemerkt, dass da Leerzeichen am Ende übrig bleiben.
    Ist gefixt, jetzt müsste das Ergebnis bei uns beiden gleich sein.

    lg
    M

  • Thx for Info autoBert. Hab mein autoit aktuallisiert, nu funktioniert es prima. Jetzt kann ich mir überlegen, welche für mich die bessere bzw einfachere Möglichkeit ist. mit stringregexp (hardcore), oder ohne. ;)

  • Mars:

    Oh... da habe ich nicht drauf geachtet... Habe nicht bemerkt, dass da Leerzeichen am Ende übrig bleiben.
    Ist gefixt, jetzt müsste das Ergebnis bei uns beiden gleich sein.

    ja jetzt muß nur noch einer per Hand nach rechnen, nicht das Raupi Recht hat. Ich dachte, als das Thema eröffnet wurde, es sei ein 2. Account von Raupi (er hat mal in der SB eine Andeutung in diese Richtung Rift gemacht) und er ist nur zu faul.

    Spoiler anzeigen


    Raupi:


    autoBert:


    Mars:

    Einmal editiert, zuletzt von autoBert (6. Februar 2016 um 13:31)

  • Händisch nachgerechnet:

    Aventurin: 74
    Funkelblatt: 9
    Durchsichtiger Stoff: 4
    Thalasiterz: 4
    Thalasit-Kristall: 2
    Sagenumwobenes Fell: 3
    Thalasit-Kristall: 2
    alles andere 1x


    Kann man eigentlich ein 2D Array mit Stringinstr durchsuchen?
    Versuche grade die [ ] raus zu bekommen

  • Du kannst jedes Element durchsuchen, einfacher ist aber in SFile zu tauschen.

    Code
    $file = StringReplace(StringReplace($file,'[',''),']','')

    direkt nach FileRead einfügen.

    Edit: Raupi Skript liefert falschen Wert. Resultate siehe Probleme mit Arrays

    Einmal editiert, zuletzt von autoBert (6. Februar 2016 um 13:32)