Tacho funktioniert nicht so ganz.

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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
  • Hi, mein Tacho ändert ein einziges Mal die Geschwindigkeit. Bzw zeigt etwas neues dort an. Aber wenn ich fahre dann ändert sich dort überhaupt nichts. Ich habe mich an das Tutorial von Robdeflop gehalten.


    public TachoTimer(playerid)
    {
    new Float:Pos1[MAX_PLAYERS][3], Float:Pos2[MAX_PLAYERS][3], Float:Geschwindigkeit[MAX_PLAYERS], str[25];
    GetPlayerVelocity(playerid, Pos1[playerid][0], Pos2[playerid][1], Pos2[playerid][2]);


    TextDrawShowForPlayer(playerid, Tacho[playerid][3]);
    Geschwindigkeit[playerid] = floatround(floatsqroot(Pos1[playerid][0]*Pos2[playerid][0] + Pos1[playerid][1]+Pos2[playerid][1] + Pos1[playerid][2]*Pos2[playerid][2]) * 100 * 2);
    format(str, sizeof(str), "%.0f Km/H", Geschwindigkeit[playerid]);
    TextDrawSetString(Tacho[playerid][3], str);
    TextDrawShowForPlayer(playerid, Tacho[playerid][3]);

    GetPlayerVelocity(playerid, Pos2[playerid][0], Pos2[playerid][1], Pos2[playerid][2]);
    return 1;
    }


    Sieht jemand schon den Fehler? So rufe ich das Tacho auf.


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER && !IsPlayerNPC(playerid))
    {
    SetTimerEx("TachoTimer", 500, true, "i", playerid);
    new vehicleID = GetPlayerVehicleID(playerid);
    new vehicleModel = GetVehicleModel(vehicleID)-400;
    TextDrawSetString(Tacho[playerid][1], VehicleName[vehicleModel]);
    for(new i = 0; i < 4; i++)
    {
    TextDrawShowForPlayer(playerid, Tacho[playerid][i]);
    }
    }
    else
    {
    for(new i = 0; i < 4; i++)
    {
    TextDrawHideForPlayer(playerid, Tacho[playerid][i]);
    }
    }
    return 1;
    }


    Ich hoffe ich habe mein Problem verständlich erklärt und freue mich wenn ihr mir helfen könnt.
    MFG Acrio

  • Wenn das aus einem Tutorial stammt, Gute Nacht...
    Hier mal eine wesentlich geschicktere Variante, die auch nicht zig tausend Timer erstellt.


    forward TachoTimer();
    public TachoTimer()
    {
    new str[25], speed;
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || GetPlayerState(i) != PLAYER_STATE_DRIVER || IsPlayerNPC(i)) continue;
    GetPlayerSpeed(i, speed);
    format(str, sizeof(str), "%0.2f km/h", speed);
    TextDrawSetString(Tacho[i][3], str);
    }
    return 1;
    }


    Unten im Code hinzufügen:
    stock GetPlayerSpeed(playerid, &Float:speed) // By: [XST]O_x
    {
    new Float:ST[4];
    if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid)!=PLAYER_STATE_PASSENGER)
    GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
    else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
    ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 100.3;
    speed = ST[3];
    return 1;
    }


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER && !IsPlayerNPC(playerid))
    {
    TextDrawSetString(Tacho[playerid][1], VehicleName[GetVehicleModel(GetPlayerVehicleID(playerid))-400]);
    for(new i = 0; i < 4; i++) TextDrawShowForPlayer(playerid, Tacho[playerid][i]);
    }
    else
    {
    for(new i = 0; i < 4; i++) TextDrawHideForPlayer(playerid, Tacho[playerid][i]);
    }
    return 1;
    }



    OnGameModeInit:
    SetTimerEx("TachoTimer", 500, 1);

  • das ist der fehler:



    new Tachotimer{MAX_PLAYERS]


    OnPlayerStateChange:


    Tachotimer[playerid] = SetTimerEx("TachoTimer", 500, 1);



    OnPlayerExit Vehicle



    Killtimer (Tachotimer[playerid];

  • Narcoti: Das ist absoluter Käse was du da schreibst.
    Zum einen stimmt die Syntax nicht, zum anderen macht die Semantik keinen Sinn.


    Tachotimer[playerid] = SetTimerEx("TachoTimer", 500, 1);
    Das wird nur für ID 0 funktionieren, da du playerid nicht übergibst.


    Den Timer bei OnPlayerExit zu killen ist schlecht, da der Spieler zum Beispiel im Aute sterben kann, und da wird OnPlayerExit nicht aufgerufen.
    Zudem fehlt eine Klammer bei dem Code von dir.


    Selbst die Definition von Tachotimer wird Errors geben, da du einmal { und einmal ] nutzt, das geht nicht.


    :pinch:


  • 1. also bitte wenn du im auto stirbst wird onplayerexitveh abgefragt is bei mir ja auch so,
    2. jeder der bisschen ahunng von scriptng hat versteht was ich meinte mit Settimerex(...). das ich fasch gemacht habe ein bisschen selbstvorderung sollte man schon haben,
    3. mann muss den timer killen wenn man ausem auto steigt sons würd das ja recoursen fressen wie wale plankton

  • 1. also bitte wenn du im auto stirbst wird onplayerexitveh abgefragt is bei mir ja auch so,
    2. jeder der bisschen ahunng von scriptng hat versteht was ich meinte mit Settimerex(...). das ich fasch gemacht habe ein bisschen selbstvorderung sollte man schon haben,
    3. mann muss den timer killen wenn man ausem auto steigt sons würd das ja recoursen fressen wie wale plankton


    1.) Wie bereits gesagt, nein, wird es nicht. Hier hast du den Beweis, kannst du gerne selbst testen.
    [21/05/2014 21:00:39] OnPlayerEnterVehicle
    [21/05/2014 21:01:45] OnPlayerDeath
    [21/05/2014 21:01:45] [death] Jeffry died 255

    Code:
    #include <a_samp>


    public OnFilterScriptInit()
    {
    AddStaticVehicle(415,1957.8439,1342.8807,15.374,0.0,0,0);
    return 1;
    }


    public OnPlayerDeath(playerid, killerid, reason)
    {
    print("OnPlayerDeath");
    return 1;
    }


    public OnPlayerEnterVehicle(playerid, vehicleid)
    {
    print("OnPlayerEnterVehicle");
    return 1;
    }


    public OnPlayerExitVehicle(playerid, vehicleid)
    {
    print("OnPlayerExitVehicle");
    return 1;
    }
    => OnPlayerExitVehicle wurde nicht aufgerufen.



    2.) Du hast den Code eher verschlimmert als verbessert, ich sehe dabei keine Hilfe, denn der Timerstart war ja im Code verglichen mit deinem Vorhaben gleich, aber hingegen syntaktisch korrekt.


    3.) Nein, muss man nicht wenn man einen globalen Timer nimmer, der durch alle Spieler loopt, was wesentlich besser ist, da man bei 500 Spielern dann nicht 500 Timer hat.


  • ja dan macht mn halt in ondeath und onexitveh killtimer(...)

  • ja dan macht mn halt in ondeath und onexitveh killtimer(...)


    Und was ist wenn der Spieler den Server verlässt? => OnPlayerDeath & OnPlayerExitVehicle werden nicht aufgerufen.
    Und was ist wenn der Spieler sich aus dem Fahrzeug teleportiert. => OnPlayerDeath & OnPlayerExitVehicle werden nicht aufgerufen.
    Und was ist wenn der Spieler aus dem Auto jemanden /spec-tated? => OnPlayerDeath & OnPlayerExitVehicle werden nicht aufgerufen.
    Und was ist wenn der Spieler vom Fahrzeug fällt (Motorrad)? => OnPlayerDeath & OnPlayerExitVehicle werden nicht aufgerufen.
    ...
    Soll ich weiter machen?


    Diese Methode wirft nur Fehler auf, es wäre Schwachsinn das so zu machen und ich kann dir garantieren, dass jeder auch nur halbwegs kompetente Programmierer hier zustimmt.
    (Zustimmung = Grünen "Bedank-Button" drücken.)

    3HZXdYd.png

    5 Mal editiert, zuletzt von Jeffry ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • äää wi ich sehe hast du keine ahnung also gib das besserweissen auf.


    1. OnPlayerDis muss man des texdraw logischerweise hiden


    2. ausem fahrzeug geporter kan man abfragen ob der andere im fahrzeug it und auch wenn onplayerexitv wird ABGERUFEN!!!!


    3. wenn er vom bike fällt omg das ist schon etwas peinlich, wird natürlich onexit aufgerufen -.-




    /q

  • Narcoti, bitte hör mit dem flamen auf.


    Jeffry hat weitaus mehr Ahnung als du. Kann dir hier jeder bestätigen.
    Das, was du da gerade veranstaltest, trägt in keinster Weise zur Lösung des Problems bei.


    ich flame gar net,


    und sowso ich bin vor dir und dem jef hier registriert

  • Narcoti: Was hat das damit zu tun? Jeffry hat mehr Ahnung als du,
    auch wenn er nicht so lange Registriert ist wie du.
    Du solltest lieber nochmal lernen gehen.

  • und sowso ich bin vor dir und dem jef hier registriert


    Ernsthaft?
    Dazu muss ich jetzt nichts sagen, oder?



    äää wi ich sehe hast du keine ahnung also gib das besserweissen auf.


    Da ich es besser weiß und es auch belegen kann, schätze ich mal, dass ich das Recht dazu habe, auch wenn du es nicht einsehen willst, dass du mit deinen Aussagen eben völlig daneben liegst. Wir können auch noch ewig so weiter machen, ich habe damit kein Problem, da ich dir jede Falschaussage die du hier tätigst mit einem Gegenteil belegen kann. Also bitte, nur zu.



    1. OnPlayerDis muss man des texdraw logischerweise hiden


    Nein, muss man nicht. Warum sollte ich ein TextDraw verstecken, wenn der Spieler den Server verlässt? Er kann es ja sowieso nicht mehr sehen, von daher ist das unnötig.
    Den Timer muss man, wenn er global erstellt ist, auch nicht stoppen, da er ja für alle anderen Spieler weiterläuft. Das spart Ressourcen und schont somit den Server. Einer mag sogar sagen das spart Strom, da die CPU weniger rechnen muss, aber das geht dann doch etwas weit.



    2. ausem fahrzeug geporter kan man abfragen ob der andere im fahrzeug it und auch wenn onplayerexitv wird ABGERUFEN!!!!


    Da kannst du noch so viele Ausrufezeichen setzen, deine Rechtschreibung macht das leider keineswegs besser und deine Aussagen somit keineswegs kompetenter, ganz zu schweigen von der Richtigkeit dieser "Aussage".
    Hier der Gegenbeweis:


    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.



    Log:


    Code:
    #include <a_samp>


    public OnFilterScriptInit()
    {
    AddStaticVehicle(522,1957.8439,1342.8807,15.374,0.0,0,0);
    return 1;
    }


    public OnPlayerDeath(playerid, killerid, reason)
    {
    print("OnPlayerDeath");
    SendClientMessageToAll(-1,"OnPlayerDeath");
    return 1;
    }


    public OnPlayerEnterVehicle(playerid, vehicleid)
    {
    print("OnPlayerEnterVehicle");
    SendClientMessageToAll(-1,"OnPlayerEnterVehicle");
    return 1;
    }


    public OnPlayerExitVehicle(playerid, vehicleid)
    {
    print("OnPlayerExitVehicle");
    SendClientMessageToAll(-1,"OnPlayerExitVehicle");
    return 1;
    }


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER) print("PLAYER_STATE_DRIVER"), SendClientMessageToAll(-1,"PLAYER_STATE_DRIVER");
    if(newstate == PLAYER_STATE_ONFOOT) print("PLAYER_STATE_ONFOOT"), SendClientMessageToAll(-1,"PLAYER_STATE_ONFOOT");
    return 1;
    }


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    SetPlayerPos(playerid, 0.0,0.0,0.0);
    print("SetPlayerPos");
    SendClientMessageToAll(-1,"SetPlayerPos");
    return 0;
    }
    Du darfst es gerne selbst testen.



    3. wenn er vom bike fällt omg das ist schon etwas peinlich, wird natürlich onexit aufgerufen -.-


    Das kann schnell vorkommen, wie du im Video gesehen hast. Ob das nun peinlich ist oder nicht (man könnte ja auch runtergerammt werden), es ist doch ziemlich unschön wenn plötzlich mehrere Timer laufen, die nicht mehr gestoppt werden können, da sie auf keiner Variable hinterlegt sind.

  • Alles in allem hat Jeffry komplett recht mit seiner Aussage, außerdem habe ich selbst Erfahrung mit seinen Fähigkeiten im Bereich des Scriptens machen dürfen und kann somit sagen, dass es eindeutig fähig ist. Also bitte hör auf hier Dinge beweisen zu wollen die einfach nicht da sind.. Jeffry hat einfach komplett Recht.