Zeit Fehler

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Wo ist der Unterschied zwischen


    SetTimer("countdown",1000,true);


    und


    new string3[64];
    new timeMs = ( GetTickCount() - racestart );
    //timeMs(millisekunden) in Min:Sek.Ms umrechnen
    new minuten = (timeMs/60000);
    timeMs -= (minuten * 60000);
    new sekunden = (timeMs/1000);
    format(string3, sizeof string3,"Zeit:0%d/%d!",minuten,sekunden);
    SendClientMessageToAll(grün, string3);


    warum läuft das untere schneller bzw. das obere langsamer-.-?

    KleineHilfe 2.0

  • Vorhaben:
    Ich habe 2 Timer. Der eine gilt dazu öffentlich den Textdraw hoch zu zählen was auch eig. wunderbar funktioniert wenn 1000 1 Sekunde ist und der andere zählt intern mit und wenn er durch's Ziel(Race) fährt soll die Zeit wiedergegeben werden. Ich hab das so gemacht ums bei jedem CP zu sehen ob die timer übereinstimmen. Ding ist, von Checkpoint zu Checkpoint ist der untere Timer im ersten Post höher als der andere. Und das anfangs 5 Sekunden und später um die 30 Sekunden. Ich verstehe nur nicht warum der interne schneller bzw. der globale langsamer ist! Kann man nicht einfach den internen timer in den globalen einbauen ?

    KleineHilfe 2.0

  • was wurde aus dem alten Thema ??


    new racestart; //oben im script


    //Dort wo das rennen gestartet wird
    racestart = GetTickCount();


    // Funktion zu Zeitwiedergabe
    GetRaceTime()
    {
    new string3[64];
    new timeMs = ( GetTickCount() - racestart );
    //timeMs(millisekunden) in Min:Sek.Ms umrechnen
    new minuten = (timeMs/60000);
    timeMs -= (minuten * 60000);
    new sekunden = (timeMs/1000);
    format(string3, sizeof(string),"0%d/%d!",minuten,sekunden);
    return string3;
    }


    hier jetzt noch einfacher für dich mit Funktion...
    nur noch
    GetRaceTime(); dort wo du die zeit haben willst und fertig


    new beispiel[50];
    format(beispiel, sizeof(beispiel), "Zeit: %s", GetRaceTime());
    SendClientMessageToAll(0xFF0000FF, beispiel);


    Der Code mit GetTickCount() ist genauer da er die aktuelle Zeit beim racestart Speichert und dann bei der Wiedergabe einfach die Differenz aus aktueller und vorher in "racestart" gespeicherter Zeit nimmt. Zeitmessungen mit i-welchen Timern geht nie wirklich richtig gut

  • Servus d0.
    Ich habs jetzt anders gelöst.


    new racestart;


    racestart = SetTimer("countdown",1000,true);


    new string3[64];
    racestart = ( GetTickCount() );
    format(string3, sizeof string3,"Zeit:0%d/%d!",Mini,second);
    SendClientMessageToAll(grün, string3);


    Das funktioniert eig. so wie ich wollte nur iwie versteh ich den Warning nicht. Ich benutz racestart doch.
    C:\Dokumente und Einstellungen\user\Desktop\Games\Samp-Server\gamemodes\RaceLV.pwn(792) : warning 204: symbol is assigned a value that is never used: "racestart"


    Danke dennoch für deine Schnipsel
    Naja auf jedenfall habe ich ein schwierigeres Anliegen. Ich möchte das die Zeit regelrecht gespeichert wird und am Ende des rennens abrufbar wird von allen Spielern.
    Sprich ich habs mir so vorgestellt das am Ende ein MSG Dialog erscheint in dem die Top 10 platzierten in der Reihenfolge der Zeit natürlich der 1. Platz kleinste Zeit ganz oben zu sehen sind. Wie kann ich das umsetzen? :S Derzeit lasse ich auch nur um die Position zu messen beim Entern des letzten Checkpoints eine Variable +1 hoch zählen


    //Edit
    Ich benutze Dini, kann ich da nicht von den ersten 10 Spielern die Zeit in einer Datei speichern und am Ende aufrufen? Dadurch das die Namen durch Platzierungen unterschiedlich gespeichert werden, sollten sie doch auch von 1-10 aufrufbar sein. Bitte um hilfe


    //Edit
    Ich probiers mal eben mit
    new Platz[64];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(Platz,sizeof(Platz),"/Platzierung/%s.txt");


    & co

    KleineHilfe 2.0

    Einmal editiert, zuletzt von YaBroo ()

  • Aber es funktioniert?!
    Nagut dann probier ichs gleich nochmal anders aus.


    //EDIT


    new Platz[64];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(Platz,sizeof(Platz),"/Platzierung/%s.txt");



    dini_IntSet(Platz,"Platzz",sieger);
    dini_IntSet(Platz,"Namen",name);//Hier ist der Fehler);


    Ich hab jetzt mal zum Testen Sieger(Platzierung) und den Namen genommen.


    C:\Dokumente und Einstellungen\user\Desktop\Games\Samp-Server\gamemodes\RaceLV.pwn(520) : error 035: argument type mismatch (argument 3)


    //Edit
    Mit
    dini_IntSet(Platz,"Namen",name[playerid]);//Hier ist der Fehler)


    gings

    KleineHilfe 2.0

    Einmal editiert, zuletzt von YaBroo ()

  • Dann prüfe erst, ob die Datei existiert und erstellst sie, falls sie nicht da ist:



    new Platzi[100];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(Platzi,sizeof(Platzi),"/Accounts/Platzierung.txt");
    if(dini_Exists(Platzi) == 0) // Also sie ist nicht da
    {
    dini_Create(Platzi); // Erstellt die Datei
    }


    //...

  • Hab ich vergessen, du bistn engel. xD
    //Edit
    Kann ich dann in eine Datei alle Daten rein schreiben von JEDEM Spieler per MAX_PLAYERS oder muss ich für jeden eine erstellen damit ich das am Ende in einem Dialog INGame abrufen kann?

    KleineHilfe 2.0

    Einmal editiert, zuletzt von YaBroo ()

  • Vorhaben:
    Jetzt da ich einen funktionierenden Timer habe, der die Zeit stoppt beim erreichen des Ziels möchte ich die Zeiten aller Spieler gespeichert werden, damit sie am Ende in einem Dialog wieder gegeben werden wenn das Rennen zu ende ist.(Von den ersten 10 Spielern die das Ziel erreichen)


    Demnach wollte ich jetzt irgendwie alles in einer Datei speichern und danach abrufen. Falsch?


    //Edit
    new Platzi[100];
    new name[MAX_PLAYERS];
    GetPlayerName(playerid,name,sizeof(name));
    format(Platzi,sizeof(Platzi),"/Accounts/Platzierung.txt");
    if(dini_Exists(Platzi) == 0)
    {
    dini_Create(Platzi);
    }
    dini_IntSet(Platzi,"Name",name[playerid]);
    dini_IntSet(Platzi,"Platz",sieger[playerid]);


    Name=67 in der Datei.


    /E3

    KleineHilfe 2.0

    Einmal editiert, zuletzt von YaBroo ()


  • Kann auch so nicht gehen :D
    Du definierst name so:
    new name[MAX_PLAYERS];


    Definier name mal so:
    new name[24];



    Greetz
    #else


    #e:
    Grad aufgefallen..
    dini_IntSet(Platzi,"Name",name[playerid]);
    Das geht so nicht, da musst Du
    dini_Set(Platzi,"Name",name);
    Verwenden.

  • Achso, nein, das ist richtig.


    Ich würde es wie folgt machen:


    Wenn es startet:
    dini_IntSet(pfad, "spielerFertig", 0);


    Sobald einer fertig ist:


    new name[MAX_PLAYER_NAME], string[50], string2[50];
    GetPlayerName(playerid, name,sizeof(name));
    new get = dini_Int(pfad, "spielerFertig") +1;
    dini_IntSet(pfad, "spielerFertig", get);
    format(string, "Name%i", get);
    format(string2, "Zeit%i", get);
    dini_Set(pfad, string, name);
    dini_IntSet(pfad, string2, ZEIT);// Hier halt die Zeit. ggf. FloatSet benutzen.


    Am ende musst du dann halt alles wieder weg machen. Am besten löschen und neu erstellen.


    Kurze Erklärung dazu:


    Mit dem get bewirken wir, dass jedesmal, wenn ein Spieler fertig wird, die Variable spielerFertig hochgestuft wird, damit wir wissen, wieviele schon fertig sind.
    Die 2 Formats sind dafür da, damit es bei dem ersten Spieler auf Name1 und Zeit1 ist und bei den nächstes Spielern dann eins höher.
    Der Rest sollte selbstverständlich sein.


    Ich hoffe ich hab nichts vergessen und es war verständlich.



    Gruß,
    Neo. :)



  • Muss ich nicht immer wenn ich möchte das es bei jedem Spieler einzelnt ist MAX_PLAYERS benutzen?
    Egal wie ichs mache mit new name wenn ich unten kein [playerid] dran hänge kommt
    C:\Dokumente und Einstellungen\user\Desktop\Games\Samp-Server\gamemodes\RaceLV.pwn(803) : error 035: argument type mismatch (argument 3)

    KleineHilfe 2.0

  • new racestart;


    racestart = GetTickCount();


    stock GetRaceTime(playerid)
    {
    new string3[64];
    new timeMs = ( GetTickCount() - racestart );
    new minuten = (timeMs/60000);
    timeMs -= (minuten * 60000);
    new sekunden = (timeMs/1000);
    format(string3, sizeof(string3),"0%d/%d!",minuten,sekunden);
    SendClientMessage(playerid,grün, "ich funktioniere");
    return string3;
    }


    Da wo gestoppt wird und gespeichert wird
    GetRaceTime(playerid);


    dini_Set(Platzi,"Zeit",GetRaceTime(playerid));


    Da bin ich nochmal .. Ich habe das Problem siehe Anhang. Kann mir das wer erklären warum 2x der Text geschickt wird?, wegen dem Return?
    & Zum Schluss ist die Zeit in der Datei viel höher als die die im Spiel gemessen wird im Chat sowie auf dem Timer. Ist es behoben wenn ich es im Stock speichere?