Positionen im Array vergleichen

  • Sonstiges
  • Positionen im Array vergleichen

    Hallöchen.
    Ich möchte ein Revive-Script modifiziren, komme aber nicht weiter. Es wird kein ACE verwendet

    Ich habe eine Addaction angehangen, was den Verwundeten "untersucht".
    Mit _damarray= ((_this select 0) getAllHitpointedammage) bekomme ich einen 3-fach Array.

    Ich möchte jetzt erreichen, dass ich _damarray select 2 Schritt für Schritt prüfe ober der Wert größer 0 ist. Das ist keine Problem.
    Wie bekomme ich es aber hin, dass ich weiß, okay das 3 und 5 Element ist größer 0? Aus _damarray select 1 soll jetzt auch 3 und 5 Element selectiert werden.

    Ich würde dann nämlich die selektieren Teile in einen extra Array packen, diese dann je nach Aktion mittels setHitpointdamage bzw. setHitIndex oder setHit auf 0 setzen und aus diesem löschen. Kommt halt darauf anm ob der 1. oder 2. Array aus _damarray ausgelesen wird.

    Quasi soll dann der Effekt entstehen, dass der Sani mehrfach ran muss und nicht nur 1x verbinden muss.

    Oder kann man mit CursorTarget ein anvisiertes Körperteil auslesen?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Drunken Officer ()

  • besser ...


    Shell-Script

    1. _arr = [...]; //Was auch immer an daten einholen
    2. scopeName "loop";
    3. {
    4. //Alle durchgehen bis ein eintrag "matcht"
    5. if (...) then
    6. {
    7. ...
    8. breakTo "loop";
    9. true
    10. }
    11. else
    12. {
    13. false
    14. };
    15. } count _arr;
    Alles anzeigen
    macht genau was du willst, benötigt keinen extra durchgang und ist von der komplexität O(N) und erfordert keine neu generierung der arrays (schneller, wenn auch nur marginal)


    code snippet muss lediglich noch an deinen use-case angepasst werden


    um dir jedoch einen rat zu geben ... verlänger lieber die dauer die das verbinden insgesamt einnimmt statt die anzahl der interaktionen
    die leute mögen es eigentlich nicht wenn sie mehrmals schwierig ein menu raus suchen müssen und werden lieber warten
  • @X39 produzierst du mit deinem breakTo nicht eine Endlosschleife? Weil sobald der Teil ausgeführt wird, bedeutet es ja dass der Treffer innerhalb des Arrays gefunden wird. Wenn du aber wieder raus springst fängt der 8tt]count[/tt] doch wieder von vorne an, bis er den selben Treffer wieder findet und dann wieder raus springt und so weiter und so fort...
    Oder gehst du davon aus dass _arr vor breakTo so verändert wird dass der Treffer verschwindet? Aber das würde dann ja die ersten Elemente des Arrays unnötig oft durch iterieren oder nicht? :28_thinking:
    Entwickler von SQDev
    Co-Entwickler von OurAltis
  • Nach all den Jahren kommt X39 immer noch mit "Komplexität" und "Generierung von Arrays" und tut so, als ob diese Konzepte irgendeine Bedeutung für SQF hätten.
    Besser als meins soll sein Beispiel sein. Lesbarer ist es, wie dieser Thread zeigt, jedenfalls nicht. Vielleicht aber performanter (nicht das Thema hier btw.)?
    Ich würde ja jetzt gerne mittels des Code Performance-Test der Debug-Konsole das Gegenteil beweisen, aber sein Snippet ist, so wie es hier vorliegt, nicht mal funktionabel.
    Schlimmer noch: das true hinter dem breakTo ist Code, welcher niemals ausgeführt werden kann. "Unreachable code" also. Ich würde sowas generell vermeiden.
    "Besser" ist da überhaupt nix.
  • Dorbedo schrieb:

    @X39 Bei dem Konstrukt brichst du doch aber nach dem ersten Fund ab. Ich hab DrunkenOfficer so verstanden, dass er alle hitpoints haben will, welche nicht 0 sind.
    Ich denke, dass @commy2s Lösung da sogar schon die schnellste Variante sein sollte.
    der ansatz den er wollte hätte dies erfordert, den den ich hier vorgestellt hatte, würde ohne weiteres array auskommen


    commy2 schrieb:

    Nach all den Jahren kommt X39 immer noch mit "Komplexität" und "Generierung von Arrays" und tut so, als ob diese Konzepte irgendeine Bedeutung für SQF hätten.[...]
    Arrays in SQF sind wie Arrays in jeder anderen sprache auch ... aber hey ... erstell deine 400 weiteren arrays gern weiter

    commy2 schrieb:

    [...] aber sein Snippet ist, so wie es hier vorliegt, nicht mal funktionabel. [...]
    das ziel der hilfe ist nicht, jemandes anderen arbeit zu erledigen sondern ihm lösungswege zu zeigen... du hast den code für ihn geschrieben, ich habe ihn grob skiziert
    mit dem snippet oben sollte jeder was anfangen können der die gröbsten basis kenntnisse SQF hat

    commy2 schrieb:

    [...] Schlimmer noch: das true hinter dem breakTo ist Code, welcher niemals ausgeführt werden kann. [...]
    Ist korrekt, fehler meinerseits
  • X39 schrieb:

    das ziel der hilfe ist nicht, jemandes anderen arbeit zu erledigen sondern ihm lösungswege zu zeigen... du hast den code für ihn geschrieben, ich habe ihn grob skiziert
    mit dem snippet oben sollte jeder was anfangen können der die gröbsten basis kenntnisse SQF hat
    Fraglich ist jedoch, ob eine recht komplexe Skizze für das Problem hilfreicher als eine simple - aber fertige - Lösung ist.

    Wenn ich Hilfe brauche und mir jemand einen Pseudocode vor die Nase zimmert, hilft mir das kein Stück. Wenn ich jedoch einen fertigen Code habe, versuche ich viel eher zu verstehen, wie das Problem in Zukunft angegangen werden kann. Noch dazu hab ich dann eine Lösung, die ich in Zukunft universal anwenden kann.


    @Drunken Officer hat den Beitrag von @commy2 geliked, deinen nicht. Anscheinend hat ihm dein Code nicht wirklich geholfen. Drei Mal darfst du raten, wieso.


    Und seien wir mal ehrlich, lieber X39, du versuchst über "verbesserte" Algorithmik ein paar milli- bzw. nanosekunden rauszuholen, benutzt aber an anderer Stelle dann wieder 4 verschiedene spawns und loops, weil du CBA verteufelst. In SQF ist es wirklich unerheblich, ob die Algorithmik ein paar ms schneller ist, die Gefahren für die Performance lauern woanders (scheduled environment, heavy script commands, etc.). Lieber bessere readability als ein "Super"-Algorithmus...
    "Sie haben Feinde? Super! Das heißt, dass Sie sich in Ihrem Leben für etwas eingesetzt haben." - Winston Churchill

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von chris579 ()

  • chris579 schrieb:

    Und seien wir mal ehrlich, lieber X39, du versuchst über "verbesserte" Algorithmik ein paar milli- bzw. nanosekunden rauszuholen, benutzt aber an anderer Stelle dann wieder 4 verschiedene spawns und loops, weil du CBA verteufelst. In SQF ist es wirklich unerheblich, ob die Algorithmik ein paar ms schneller ist, die Gefahren für die Performance lauern woanders (scheduled environment, heavy script commands, etc.). Lieber bessere readability als ein "Super"-Algorithmus...
    Das passt hier so gut

    Donald Knuth schrieb:

    Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.
  • Ich bin jetzt da, dass der Array mit den Hitpoints auf die reduziert wird, die tatsächlich betroffen sind. Das ist auch garnicht so blöd, den vorher habe ich die Puppe abgefangen und auf 0 gesetzt. Damit sah der aber unverletzt aus. Jetzt fange ich den ab, habe den reduzierten Array und setze die Figur nachträglich wieder hoch, um einen Verletzungseffekt zu simulieren.

    Ich wollte zunächst mit einem Dialog arbeiten, welches in Figur anzeigt und man via Klick verbindet, was ich aber verworfen habe, da diese eine zusätzliche Definition bedeutet hätte, was wiederrum einen Eintrag in der Description.ext bedeutet hätte.

    z.Z. wird der Patient untersucht und es taucht auf, dass der Patient an x, y, z verwundet ist.

    Ich bin noch am Überlegen ob ich
    a) einen Eintrag erstelle und der Sani dann alles verbindet , quasi die Animation wird so oft wiederholt, soviele Körperteile betroffen sind. Es werden dann x-First-Aid-Dingsbums benötigt oder ein Verbandskasten
    oder
    b) ich den Sani jeweils eine Verwundung verbinden lasse und dieser dann den Eintrag erneut starten lasse, bis alles heile ist. Auch hier pro Aktion ein so ein kleines Teil oder Verbandskasten

    Ich tendiere eher zu B und muss das mal austesten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Drunken Officer ()