Zähler zurücksetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

Hallo Community!
Vorweg muss ich sagen, dass ich eigentlich keinen blassen schimmer von python hab.
Ich bin Mitveranstalter von virtuellen Rennserien in Assetto Corsa. Für dieses Spiel gibt es sog. Apps die einem viele zusätzliche Features bieten. Die Hauptapp die wir nutzen unterstützt leider ein wichtiges Feature nicht: Das Bestrafen von Cuts.

Ich hab solange in dem Code rumgewühlt bis ich mir selbst ein wenig was zusammenreimen konnte. Ich hab anhand folgender Stelle gesehen dass es einen "cutsCounter" gibt, der nach bestimmten Bedingungen um +1 addiert wird:

Code: Alles auswählen

        if info.physics.numberOfTyresOut > wheelsOutAllowed and not outOfTrack :
            cutoffReturn = 0
            outOfTrack = 1
            cutsCounter += 1
            if (info.graphics.completedLaps - 1) not in cutLaps :
                cutLaps.append(info.graphics.completedLaps - 1)
            if checkWheelsOut :
                ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                ac.setVisible(cutLapCounterBkGr, 1)
                ac.setVisible(cutLapCounterLabel, 1)  
        if info.physics.numberOfTyresOut <= wheelsOutAllowed and outOfTrack  :
            outOfTrack = 0
            cutoffReturn = currentTime
        
        if cutoffReturn and not outOfTrack:
            if currentTime - cutoffReturn < cutsCounterBlinkingTime :
                if (((currentTime - cutoffReturn)//cutsCounterBlinkFrequency)%2) != 0 :
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                else:
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr2.png")
            else:
                cutoffReturn = 0
                if checkWheelsOut :
                    ac.setVisible(cutLapCounterBkGr, showCutsPermanent)
                    ac.setVisible(cutLapCounterLabel, showCutsPermanent)
        ac.setText(cutLapCounterLabel, "{0}".format(len(cutLaps)))
Dann hab ich mir in dem Code andere Situationen angeschaut um zu sehen wie welche Bestrafung getriggert wird und hab mir daraus dann selbst etwas gebastelt.
Aktueller Stand: Wenn ich X (in diesem Fall >2) mal die Strecke verlasse dann wird die gewünschte Strafe getriggert. ABER: Hört nicht auf zu zählen. Ich bekomm die Strafe dann unendlich oft.
Ich hab versucht am Ende den cutsCounter wieder = 0 zu setzen, allerdings erscheint die App dann nichtmehr im Spiel. Ist also scheinbar doch irgendwas nicht i.O..

Code: Alles auswählen

#				======================== CUT PENALTY TEST ==========================

            if racePhase == "Race" and cutsCounter > 2 :             
                    currentPenalty.append("RaceAdmin App")
                    currentPenalty.append("Cut Track Limits 8/8")
                    currentPenalty.append(info.graphics.completedLaps + 1)
                    currentPenalty.append("Pit Lane drive through")
                    currentPenalty.append("plth")
                    currentPenalty.append(0)
                    currentPenalty.append(1)
                    currentPenalty.append(N_LapsToCompetePenalty)
                    currentPenalty.append(-1)
                    currentPenalty.append("inprogress")
                    currentPenalty.append("Prohibited")
                    messageArr.append("| Cut Track Limits 8/8 | Lap: {1} | PENALTY! Pit Lane drive through |")
                    penaltyMessage = "Pit Lane drive through"
                    cutoffNewPenalty = currentTime
                                        
                    penalties.append(currentPenalty)
                    penaltiesUpdated = 1
                    cutsCounter = 0
                    currentPenalty = []
Ich häng jetzt ungefähr schon 2 Wochen in dem Code und versuch immer wieder irgendwas rum zu probieren, komme aber leider zu keinem Ergebnis. Vielleicht hat einer von euch ja einen Rat, wäre euch sehr sehr dankbar!

Grüße,
Stefan
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was als erstes auffällt: Dein Code ist falsch eingerückt. Der Code aus deinem ersten Snippet ist - wie unter Python angedacht - mit 4 Leerzeichen je Einrückungsebene eingerückt. Du verwendest entweder Tabs oder 8 Leerzeichen. Da solltest du dich den 4 Leerzeichen anpassen.

Wenn beide Snippets aus einer Datei stammen, deutet das auf Python 2 hin - weil da unter Python 3 nicht mehr möglich ist. Der Vollständigkeit halber: Python 2 ist tot. Aber wahrscheinlich braucht dein Spiel das.

Jetzt kennt hier aber wahrscheinlich niemand das Spiel oder die Schnittstelle für AddOns. Und mit zwei Snippets ist das Stochern im Dunkeln weil so zum Beispiel nicht erkenntlich wird, ob "cutsCounter" im zweiten Snippet mit dem im ersten identisch ist, oder ob es sich um zwei gleich benannte Artikel in verschiedenen Namensräumen handelt.
Wann soll die Strafe denn vergeben werden? Alle 2 "cutsCounter"? Dann könntest du mit dem Modulo-Operator arbeiten.

Code: Alles auswählen

if racePhase == "Race" and cutsCounter > 0 and cutsCounter % 2 == 0:
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

Möglicherweise ist es, wie sparrow sagt, eine Mischung der Einrückung mit Tabs und spaces.
Wenn du die Zeile `cutsCounter = 0` selbst eingefügt hast, hat sie möglicherweise Leerzeichen, während der Rest Tabs hat. In Python3 geht das nicht mehr (SyntaxError).

Vielleicht merkt dein Spiel, wenn eine App einen SyntaxError hat, und zeigt die App dann gar nicht erst an.

Das ist jetzt allerdings ziemlich viel geraten, wie sparrow schon sagte: Stochern im Dunkeln. Und bei Nebel. Mit Zahnstochern.
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

Vielen Dank für die Antwort!
Mit den eingerückten Zeilen habe ich mich an den anderen Strafen die im Code sind orientert.. Dachte das wird dann schon so passen. Sollte ja aber kein Problem darstellen, oder? Weil ich bin ja wiegesagt schon so weit, dass das Event was ich möchte getriggert wird.

Das mit dem "alle 2 Counter" wäre genau das was ich bräuchte (zwar alle 8, aber zum testen ist 2 angenehmer) !
Ich habs jetzt mal genau mit der Zeile versucht aber dann erscheint die App leider im Spiel auch nichtmehr.

Ich würde gerne einfach mal jemandem über Teamviewer oder Discord das Spiel / die App / den Code zeigen. Ich will nicht dass das jemand für mich macht, ich will versuchen zu verstehen was wann passiert und wie es dann letztendlich so funktioniert wie ich es will..

schöne Grüße
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

bords0 hat geschrieben: Dienstag 13. Oktober 2020, 15:16 Möglicherweise ist es, wie sparrow sagt, eine Mischung der Einrückung mit Tabs und spaces.
Wenn du die Zeile `cutsCounter = 0` selbst eingefügt hast, hat sie möglicherweise Leerzeichen, während der Rest Tabs hat. In Python3 geht das nicht mehr (SyntaxError).

Vielleicht merkt dein Spiel, wenn eine App einen SyntaxError hat, und zeigt die App dann gar nicht erst an.

Das ist jetzt allerdings ziemlich viel geraten, wie sparrow schon sagte: Stochern im Dunkeln. Und bei Nebel. Mit Zahnstochern.
Ich hab die Zeile selbst eingefügt. Bin dazu einfach hinter penaltiesUpdated = 1 und hab mit Eingabe eine neue Zeile gemacht. Mir ist grade aber aufgefallen dass es dann automatisch mit Tabs eingerückt ist, währende alle anderen Zeilen mit Leertaste eingerückt sind. Hab jetzt die Zeile genauso mit Leertaste eingerückt, aber leider verschwindet dann die App im Spiel wieder

schöne Grüße
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

Leider habe ich keine EDIT-Funktion entdeckt daher nochmal ein neuer Beitrag..
Ich hatte scheinabr irgend einen anderen Fehler im Code. Habs gerade nochmal mit

Code: Alles auswählen

            if racePhase == "Race" and cutsCounter > 0 and cutsCounter % 2 == 0 :      
versucht. Funktioniert soweit. Nachdem der cutCounter 2 gezählt hat bekomm ich meine Strafe, allerdings wieder unendlich oft, irgendwann hälts aber dann an. Hab nochnicht ganz durchschaut wann, aber ich glaube es hört dann auf mir Penalties zu geben wenn ich NOCHMAL 2 auf den cutsCounter dazugezählt hab. Jetzt bin ich verwirrter als vorher.. :D Weiß jemand Rat? Oder hat nicht vielleicht jemand Lust mal mit mir im Discord oder ähnliches drüber zu quatschen?
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

Die Bedingung ist ja dauerhaft erfüllt, solange cutsCounter == 2 ist. Erst wenn cutsCounter auf 3 erhöht wird, ist die Bedingung nicht mehr erfüllt.

Du musst herausfinden, warum die App nicht im Spiel erscheint, wenn du die "richtigen" Änderungen machst. Das scheint ja immer dann zu sein, wenn du eine Zeile einfügst.
Da kann je nach Editor so oder so eingerückt werden - vielleicht eben nicht passend.

Das ist m.E. konsistent damit, dass ein SyntaxError vorliegt, der import nicht klappt, und deshalb die App nicht angezeigt wird.

Lass den Code mal auf Syntax-Fehler überprüfen, es gibt auch online-checker, falls du kein Python installiert hast.

Und ein letzter Trick: Nimm noch mal die originale Version her bzw. eine Kopie. Prüfe am besten, dass sie klappt, d.h. auch im Spiel erscheint.
Dann füge nicht die Zeile ein, sondern ergänze nur die Zeile davor um einen Befehl. Drücke kein einziges Mal die Enter-Taste :-)
Also die letzten Code-Zeile sähen dann etwa so aus:

Code: Alles auswählen

                    penalties.append(currentPenalty)
                    penaltiesUpdated = 1; cutsCounter = 0
                    currentPenalty = []
Das ist kein schöner Code, und das würde man in echt nicht so machen. Aber es schließt eine Fehlerquelle aus, und eine andere fällt mir nicht ein.
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

Ich dachte eben dass ich am Ende der Bedingung den counter zurücksetze mit cutsCounter = 0 aber dann hatte ich ja scheinbar nen Syntaxfehler..
Es funktioniert aber jetzt! Mit folgendem Code

Code: Alles auswählen

            if racePhase == "Race" and cutsCounter > 0 and cutsCounter % 8 == 0 :             
                    currentPenalty.append("RaceAdmin App")
                    currentPenalty.append("Cut Track Limits 8/8")
                    currentPenalty.append(info.graphics.completedLaps + 1)
                    currentPenalty.append("Pit Lane drive through")
                    currentPenalty.append("plth")
                    currentPenalty.append(0)
                    currentPenalty.append(1)
                    currentPenalty.append(N_LapsToCompetePenalty)
                    currentPenalty.append(-1)
                    currentPenalty.append("inprogress")
                    currentPenalty.append("Prohibited")
                    messageArr.append("| Cut Track Limits 8/8 | Lap: {1} | PENALTY! Pit Lane drive through |")
                    penaltyMessage = "Pit Lane drive through"
                    cutoffNewPenalty = currentTime
                                        
                    penalties.append(currentPenalty)
                    penaltiesUpdated = 1; cutsCounter = 0
                    currentPenalty = []
Funktioniert jetzt so aber auch wenn ich in der ersten Zeile folgendes Benutze:

Code: Alles auswählen

 if racePhase == "Race" and cutsCounter > 2 : 
Ne erklärung dazu würde mich mal Interessieren. Wieso funktionierts wenn ichs mit nem ; dahinter setz, aber nicht wenn ichs ne Zeile drunter setz?

Ich hätte jetzt noch ein kleines Zuckerli oben drauf, wenn mir da noch jemand helfen kann bin ich bestens Bedient!
Aktuell wird mir eine Grafik angezeigt wenn man cuttet in der angezeigt wird in wievielen Runden man insgesamt gecuttet hat. Cuttet man also 4 mal in Runde 1 wird bei jedem Cut "1" angezeigt. Cuttet man dann erst wieder in Runde 5 oder 6 wird diese Runde über bei jedem Cut "2" angezeigt.
Ich würde das gerne ändern, dass anstelle dieser Zahl der tatsächliche cutsCounter eingeblendet wird. Cutte ich also das erste mal (unabhägnig in welcher Runde) soll da 1 stehen, beim 2. cut 2 usw.. Soll so lange hochzählen bis man die Strafe bekommt (8) und der Counter zurückgesetzt wird. Dann wieder bei 0 anfangen.

Hier mal der Code dazu:

Code: Alles auswählen

        if info.physics.numberOfTyresOut > wheelsOutAllowed and not outOfTrack :
            cutoffReturn = 0
            outOfTrack = 1
            cutsCounter += 1
            if (info.graphics.completedLaps - 1) not in cutLaps :
                cutLaps.append(info.graphics.completedLaps - 1)
            if checkWheelsOut :
                ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                ac.setVisible(cutLapCounterBkGr, 1)
                ac.setVisible(cutLapCounterLabel, 1)  
        if info.physics.numberOfTyresOut <= wheelsOutAllowed and outOfTrack  :
            outOfTrack = 0
            cutoffReturn = currentTime
        
        if cutoffReturn and not outOfTrack:
            if currentTime - cutoffReturn < cutsCounterBlinkingTime :
                if (((currentTime - cutoffReturn)//cutsCounterBlinkFrequency)%2) != 0 :
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                else:
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr2.png")
            else:
                cutoffReturn = 0
                if checkWheelsOut :
                    ac.setVisible(cutLapCounterBkGr, showCutsPermanent)
                    ac.setVisible(cutLapCounterLabel, showCutsPermanent)
        ac.setText(cutLapCounterLabel, "{0}".format(len(cutLaps)))
Ich dachte, dass ich in der letzten Zeile einfach folgendes schreiben kann, funktioniert so aber leider nicht:

Code: Alles auswählen

ac.setText(cutLapCounterLabel, "{0}".format(len(cutsCounter)))
Wenn mir das noch jemand lösen kann bin ich mehr als glücklich! Damit wird nicht nur mir sondern sehr vielen Assetto Corsa Communitys geholfen! Vielen vielen Dank im Voraus!!
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

Echt doof dass man nicht bearbeiten kann, jetzt muss ich leider wieder einen Beitrag eröffnen..
Ich habs in Griff bekommen und zusätzlich noch hinzugefügt dass im Chat bei jedem Cut eine Nachricht erscheint, bin schon fast stolz auf mich.
Der Code sieht jetzt so aus:

Code: Alles auswählen

        if info.physics.numberOfTyresOut > wheelsOutAllowed and not outOfTrack :
            cutoffReturn = 0
            outOfTrack = 1
            cutsCounter += 1
            if (info.graphics.completedLaps - 1) not in cutLaps :
                cutLaps.append(info.graphics.completedLaps - 1)
            if checkWheelsOut :
                ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                ac.setVisible(cutLapCounterBkGr, 1)
                ac.setVisible(cutLapCounterLabel, 1)
                messageArr.append("Cut Track Warning {0}/10".format(cutsCounter)) 
        if info.physics.numberOfTyresOut <= wheelsOutAllowed and outOfTrack  :
            outOfTrack = 0
            cutoffReturn = currentTime
        
        if cutoffReturn and not outOfTrack:
            if currentTime - cutoffReturn < cutsCounterBlinkingTime :
                if (((currentTime - cutoffReturn)//cutsCounterBlinkFrequency)%2) != 0 :
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                else:
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr2.png")
            else:
                cutoffReturn = 0
                if checkWheelsOut :
                    ac.setVisible(cutLapCounterBkGr, showCutsPermanent)
                    ac.setVisible(cutLapCounterLabel, showCutsPermanent)
        ac.setText(cutLapCounterLabel, "{0}".format(cutsCounter))
Ich bin jetzt schon mehr als glücklich. Ein letztes Anliegen hätte ich aber vielleicht doch noch.
Aktuell wird auch ein Cut gewertet, wenn man ganz langsam abseits der Strecke fährt, bzw. wenn man abfliegt und sowieso keinen Vorteil hat.
Im obigen Code müsste das alles soweit festgelegt sein.
Ist es irgendwie möglich, dass die Bedingung in einer bestimmten Zeit passieren muss? Quasi wenn info.physics.numberOfTyresOut > wheels Out Allowed länger als 2 sek stattfindet passiert nichts weiter / wird kein cut gewertet. Dementsprechend dann wenn info.physics.numberOfTyresOut > wheels Out Allowed weniger als 2 sek lang stattfindet soll ganz normal der Cut gewertet werden.
Ich kann leider mit den ganzen Bedingungen oben nichts anfangen, das is für mich als kompletter Laie irgendwie doch bisschen zu verstrickt jetzt..

Wäre echt cool wenn ich das jetzt noch hinbekomm, danach brauch ich definitiv nixmehr! :D
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@sleepyy: Wie bords0 bereits geschrieben hat, wird das AddOn leise sterben, wenn es zu einem Syntax-Fehler kommt. Für Python ist die Einrückung wichtig, weil dadurch Blöcke definiert werden. Wenn das Script so tut, wie du es hier zeigst, und nicht mehr, wenn du die Zeile tatsächlich in eine neue Zeile schreibst, dann stimmt etwas mit der Einrückung nicht. Das tut es aber sowieso nicht, weil deine Snippets, wie ich oben bereits geschrieben habe, nicht konsistent eine identische Einrückung verwendet. Wenn das trotzdem funktioniert ist das eher Glück und dein Editor zerschießt es dann komplett, wenn du Enter drückst. Dann musst du halt manuell die neue Zeile so einrücken wie die darüber.

Zu der Geschichte mit den "länge der Zeit des Cuts":

Code: Alles auswählen

        if info.physics.numberOfTyresOut > wheelsOutAllowed and not outOfTrack :
            cutoffReturn = 0
            outOfTrack = 1
            cutsCounter += 1
            if (info.graphics.completedLaps - 1) not in cutLaps :
                cutLaps.append(info.graphics.completedLaps - 1)
            if checkWheelsOut :
                ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                ac.setVisible(cutLapCounterBkGr, 1)
                ac.setVisible(cutLapCounterLabel, 1)  
        if info.physics.numberOfTyresOut <= wheelsOutAllowed and outOfTrack  :
            outOfTrack = 0
            cutoffReturn = currentTime
Verstehst du, was die beiden äußeren Bedingungen bedeuten?
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

Mit dem manuellen Einrücken hats leider auch nicht geklappt, aber das ist mir jetzt relativ egalm Programm tut was es soll! :D
Verstehst du, was die beiden äußeren Bedingungen bedeuten?
nein, leider nicht. Mich verwirrt das currentTime und cutoffReturn etwas.. ich kann damit nicht wirklich viel anfangen, aber vermute dass das schon irgendwas mit dem zu tun hat was ich meine..
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@sleepyy: Das ist ja schon das, was passiert, wenn die Bedingungen eintreten. Die Frage ist, ob du verstehst, was die beiden Bedingungen bedeuten. Also wann und unter welchen Bedingungen die äußeren beiden Bedingungen "wahr" sind und die entsprechenden Blöcke ausgeführt werden.
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

Ich versteh aktuell leider nocht nicht WAS genau "outOfTrack" und "cutoffReturn" ist, bzw. wann diese Variablen erfüllt sind wenn man das so nennen kann.. Ich bin zwar dabei es herauszufinden aber komm noch nicht wirklich drauf.
Ersetze ich in der ersten Zeile das "and not" z.B. durch ein "and" bekomme ich garkeinen Cut mehr angezeigt.
Setze ich in der 2. Zeile "cutoffReturn" auf 1 anstatt 0 funktioniert die App genauso wie vorher.

Ich versuch nochmal zu beschreiben was genau ich einfach mal gerne probieren würde:

Wenn info.physics.numberOfTyresOut > wheelsOutAllowed länger als 2 Sekunden passiert dann soll hinsichtlich des cutsCounter nichts passieren, nichts angezeigt werden, quasi einfach abbruch.
Wenn aber dann info.physics.numberOfTyresOut > wheelsOutAllowed weniger als 2 Sekunden stattfindet soll das Event ganz normal stattfinden mit anzeige eines Cuts usw.

Vielleicht kann man das ganze viel einfacher gestalten und einfach mal "outOfTrack", "cutoffReturn", "currentTime" vernachlässigen.
Ganz stumpfes Beispiel:

Code: Alles auswählen

        
        if info.physics.numberOfTyresOut > wheelsOutAllowed weniger als 2sek :
		    
            cutsCounter += 1
        else
            garnichts machen
            
EDIT: cutoffReturn und currentTime haben scheinbar wirklich nur damit zu tun, die Cutanzeige zum blinken zu bringen, nachdem man wieder auf die Strecke gefahren ist. Da ist also meiner Meinung nach nirgends ein "Timer" für das Event mit eingebaut
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@sleepyy: Was sich in dem Code schwierig lesen lässt: Es werden Zahlen als Wahrheitswerte missbraucht. '0' ist immer fasch, jeder andere Zahl immer richtig. True und False wäre hier einfacher zu lesen gewesen. outOfTrack schein ein Wert zu sein, der nur wahr oder falsch sein kann.

Wie von dir angedacht funktioniert es nicht. cutsCounter würde ständig hochgezählt werden, solange das man die Strecke kürzer als 2 Sekunden verlässt.
Was du eigentlich möchtest: Auf die Zustandswechsel reagieren - denn entscheiden ob es eine Strafe gibt (also ob das Verlassen kürzer als 2 Sekunden war) kannst du erst, wenn das Fahrzeug wieder zurück auf der Strecke ist.

Dein Snipped kann die beiden Zustände unterscheiden. Deshalb habe ich dich gefragt, ob du verstehst, was die äußeren beiden Bedingungen machen.
Bisher wird die Strafe verhängt, wenn die Strecke verlassen wird. Du musst das nun quasi umziehen von dem Zustand "die Strecke wurde verlassen" in "ich bin zurück auf der Strecke". Dort musst du prüfen, wie viel Zeit vergangen ist, seit die Strecke verlassen wurde. Und damit du eine Startzeit hast, musst du dir die merken, wenn die Strecke verlassen wird. currentTime scheint die aktuelle Zeit zu sein. Ob in Sekunden oder einer anderen Einheit, verrät dir vielleicht der Wert von cutsCounterBlinkingTime.
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

Wow danke, auf jeden Fall schonmal sehr hilfreich! Beschreibt ungefähr genau das, was ich die letzte Stunde lang versucht hab! Allerdings hab ich keine Ahnung wie ich das genau mit der Zeitspanne hinbekomm, bzw. wie ich die Zeit von "cutoffReturn" erfassen kann. Wie du schon sagst scheint "currentTime" die aktuelle Systemzeit zu sein, dachte ich mir auch schon.
Das klingt alles ganz nachvollziehbar wie du das schreibst, du verstehst auf jeden Fall zu 100% was ich möchte! Nur ich bekomms leider nicht hin, wie kann ich mir denn am besten die Zeit wenn "outOfTack" wahr wird "speichern" ? Und wie bring ich das am besten in den Code mit ein?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was ist denn der Wert von cutsCounterBlinkingTime?
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

Der Wert ist 5. Entspricht dann Sekunden

ich dachte vielleicht könnte mans so mal testen, oder ist das vollkommener Blödsinn? :D

Code: Alles auswählen

        if info.physics.numberOfTyresOut > wheelsOutAllowed and not outOfTrack :
            cutoffReturn = 0
            outOfTrack = 1
            cutTime = currentTime
            if (info.graphics.completedLaps - 1) not in cutLaps :
                cutLaps.append(info.graphics.completedLaps - 1)
            if checkWheelsOut :
                ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                ac.setVisible(cutLapCounterBkGr, 1)
                ac.setVisible(cutLapCounterLabel, 1)
                messageArr.append("Cut Track Limits {0}/10".format(cutsCounter))				
        if info.physics.numberOfTyresOut <= wheelsOutAllowed and outOfTrack  :
            outOfTrack = 0
            cutoffReturn = currentTime
        
        if cutoffReturn and not outOfTrack :
            if cutoffReturn - cutTime < 2 :
                cutsCounter += 1
                if currentTime - cutoffReturn < cutsCounterBlinkingTime :
                    if (((currentTime - cutoffReturn)//cutsCounterBlinkFrequency)%2) != 0 :
                        ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                    else:
                        ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr2.png")
                else:
                    cutoffReturn = 0
                    if checkWheelsOut :
                        ac.setVisible(cutLapCounterBkGr, showCutsPermanent)
                        ac.setVisible(cutLapCounterLabel, showCutsPermanent)
        ac.setText(cutLapCounterLabel, "{0}".format(cutsCounter))
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Natürlich ungetestet:

Code: Alles auswählen

        if info.physics.numberOfTyresOut > wheelsOutAllowed and not outOfTrack:
            leavingTime = currentTime
            cutoffReturn = 0
            outOfTrack = 1
        if info.physics.numberOfTyresOut <= wheelsOutAllowed and outOfTrack:
            outOfTrack = 0
            if currentTime - leavingTime < 2:  # die 2 ist die Zeit in Sekunden nachdem es keine Strafe mehr gibt
                cutsCounter += 1
                if (info.graphics.completedLaps - 1) not in cutLaps :
                    cutLaps.append(info.graphics.completedLaps - 1)
                if checkWheelsOut :
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                    ac.setVisible(cutLapCounterBkGr, 1)
                    ac.setVisible(cutLapCounterLabel, 1)  
                cutoffReturn = currentTime
        
        if cutoffReturn and not outOfTrack:
            if currentTime - cutoffReturn < cutsCounterBlinkingTime:
                if (((currentTime - cutoffReturn)//cutsCounterBlinkFrequency)%2) != 0 :
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                else:
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr2.png")
            else:
                cutoffReturn = 0
                if checkWheelsOut :
                    ac.setVisible(cutLapCounterBkGr, showCutsPermanent)
                    ac.setVisible(cutLapCounterLabel, showCutsPermanent)
        ac.setText(cutLapCounterLabel, "{0}".format(len(cutLaps)))
Wenn da wieder nichts angezeigt wird, musst du dich wohl oder übel auf die Suche nach dem Logfile machen, das hoffentlich die Fehler protokolliert.
sleepyy
User
Beiträge: 14
Registriert: Dienstag 13. Oktober 2020, 13:03

Wow, vielen vielen Dank! Hab mir erstmal den Code durchgelesen um zu verstehen, habs auch verstanden und dann mal selbst eingetippt (muss zugeben ich hab 2 mal gespickt :D ).
FUNKTIONIERT!
Jetzt ist mir allerdings ein kleiner Bug aufgefallen, wofür die App nichts kann, welchen die App aber vielleicht unterbinden kann.
Wenn man wirklich blöd cuttet kanns passieren dass man sofort 2 Cuts bekommt, was natürlich auch nicht sein sollte. Gibt es die Möglichkeit dem Event einen cooldown zu geben? Sprich, wenn ein Cut gezählt wurde, kann für 2sek kein weiterer Cut gezählt werden?

EDIT: Dachte da an sowas, kann das funktionieren?

Code: Alles auswählen

        if info.physics.numberOfTyresOut > wheelsOutAllowed and not outOfTrack :
            leavingTime = currentTime
            cutoffReturn = 0
            outOfTrack = 1
        if info.physics.numberOfTyresOut <= wheelsOutAllowed and outOfTrack :
            outOfTrack = 0
            if currentTime - penaltyTime > 2 :
                if currentTime - leavingTime < 2 :
                    cutsCounter += 1
                    penaltyTime = currentTime
                    messageArr.append("Cut Track Limits {0}/10".format(cutsCounter))
                    if (info.graphics.completedLaps - 1) not in cutLaps :
                        cutLaps.append(info.graphics.completedLaps - 1)
                    if checkWheelsOut :
                        ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                        ac.setVisible(cutLapCounterBkGr, 1)
                        ac.setVisible(cutLapCounterLabel, 1)				
                    cutoffReturn = currentTime

        if cutoffReturn and not outOfTrack :
            if currentTime - cutoffReturn < cutsCounterBlinkingTime :
                if (((currentTime - cutoffReturn)//cutsCounterBlinkFrequency)%2) != 0 :
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr.png")
                else:
                    ac.setBackgroundTexture(cutLapCounterBkGr, "apps/python/OSRW_RaceAdmin/images/cutLapCounterBkGr2.png")
            else:
                cutoffReturn = 0
                if checkWheelsOut :
                    ac.setVisible(cutLapCounterBkGr, showCutsPermanent)
                    ac.setVisible(cutLapCounterLabel, showCutsPermanent)
        ac.setText(cutLapCounterLabel, "{0}".format(cutsCounter))
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Ja, aber ich würde die beiden Abfragen zusammenführen:

Code: Alles auswählen

if currentTime - penaltyTime > 2  and currentTime - leavingTime < 2:
Und an der Stelle versuchst du auf penaltyTime zuzugreifen. Das heißt irgendwo vorher muss das einmal definiert werden, weil sonst keine Variable mit dem Namen existiert.
Da muss also ein penaltyTime = 0 hin. Irgendwo muss es ja auch ein outOfTrack=0 weiter oben geben, da würde ich es drunter schreiben.
Antworten