Abbruch einer Funktion - gettime()

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,


    es geht um mein Trashcan System. Mit Enter kann man also in der Nähe einer Mülltonne ein wenig durch den Müll wühlen. Dieser Wühlvorgang dauert 4 Sekunden. Nun wollte ich es einrichten, dass man in diesen 4 Sekunden den Vorgang per Enter wieder abbrechen kann.
    Hat man fertig gewühlt, kann man dieselbe Tonne erst nach 30min wieder durchstöbern. Folgender Code setzt dies aber nicht um, bzw. ich kriege es nicht hin, dass, wenn eine Mülltonne durchwühlt worden ist, dass sie danach nicht mehr verfügbar ist. Desweiteren bin ich mir nicht sicher, wie ich die Zeit zurücksetze (siehe Code Zeile 25).


    if(newkeys & KEY_SECONDARY_ATTACK)
    {
    for(new i = 0; i < MAX_TRASH_CANS; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 2.0, TrashCans[i][0], TrashCans[i][1], TrashCans[i][2]))
    {
    if(!AlreadySearching[playerid]) //Wenn der Spieler an eine Mülltonne geht und sie durchsucht.
    {
    if(gettime() < TrashCans_ID[i])
    {
    new stringDE[128],
    stringEN[128];
    format(stringDE, sizeof(stringDE), "»WARNUNG« Diese Mülltonne wurde schon geplündert. Versuche es in %imin noch einmal.", (TrashCans_ID[i] - gettime())/60);
    format(stringEN, sizeof(stringEN), "»WARNING« This trash can has already been emptied. Try again in %imin.", (TrashCans_ID[i] - gettime())/60);
    TrashCans_ID[i] = gettime() + 30*60;
    return SendLanguageMessage(playerid, C_RED, stringDE, stringEN);
    }
    TrashCanLootTimer[playerid] = SetTimerEx("TrashCanLoot", 4000, false, "i", playerid, i);
    ApplyAnimation(playerid, "BD_FIRE", "BD_Panic_Loop", 4.1, 0, 0, 0, 0, 4000, 1);
    SendLanguageMessage(playerid, C_PINK, "»SPIELER« Du stöberst in der Mülltonne rum...", "»PLAYER« You rummage through the trash...");
    AlreadySearching[playerid] = true;
    }
    else //Wenn der Spieler bereits an einer Mülltonne ist und schon am Wühlen ist.
    {
    TrashCans_ID[i] = 0; //Wenn Abbruch, dann Zeit zurücksetzen.
    SendLanguageMessage(playerid, C_RED, "»WARNUNG« Du hast aufgehört im Müll zu wühlen.", "»WARNING« You stopped rummaging through the trash.");
    ClearAnimations(playerid);
    KillTimer(TrashCanLootTimer[playerid]);
    AlreadySearching[playerid] = false;
    }
    }
    }
    }

  • Hier, schreibs so:


    if(newkeys & KEY_SECONDARY_ATTACK)
    {
    for(new i = 0; i < MAX_TRASH_CANS; i++)
    {
    if(!IsPlayerInRangeOfPoint(playerid, 2.0, TrashCans[i][0], TrashCans[i][1], TrashCans[i][2])) continue;
    if(!AlreadySearching[playerid])
    {
    if(gettime() < TrashCans_ID[i])
    {
    new stringDE[128],stringEN[128];
    format(stringDE, sizeof(stringDE), "»WARNUNG« Diese Mülltonne wurde schon geplündert. Versuche es in %imin noch einmal.", (TrashCans_ID[i] - gettime())/60);
    format(stringEN, sizeof(stringEN), "»WARNING« This trash can has already been emptied. Try again in %imin.", (TrashCans_ID[i] - gettime())/60);
    return SendLanguageMessage(playerid, C_RED, stringDE, stringEN);
    }
    TrashCanLootTimer[playerid] = SetTimerEx("TrashCanLoot", 4000, false, "ii", playerid, i);
    ApplyAnimation(playerid, "BD_FIRE", "BD_Panic_Loop", 4.1, 0, 0, 0, 0, 4000, 1);
    SendLanguageMessage(playerid, C_PINK, "»SPIELER« Du stöberst in der Mülltonne rum...", "»PLAYER« You rummage through the trash...");
    AlreadySearching[playerid] = true;
    }
    else
    {
    TrashCans_ID[i] = 0;
    SendLanguageMessage(playerid, C_RED, "»WARNUNG« Du hast aufgehört im Müll zu wühlen.", "»WARNING« You stopped rummaging through the trash.");
    ClearAnimations(playerid);
    KillTimer(TrashCanLootTimer[playerid]);
    AlreadySearching[playerid] = false;
    }
    }
    }


    //Und dann hier:
    public TrashCanLoot(playerid,i)
    {
    TrashCans_ID[i] = gettime() + 30*60;
    //Du hast die Mülltonne erfolgreich durchsucht
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Das "continue;" hat es nur noch mehr zerschossen. ;) Er hat mir bei jedem Durchwühlen alle Möglichkeiten ausgespuckt.


    Ich hab es nun.


    TrashCans_ID[i] = gettime() + 30*60;
    ...kommt unter TrashCanLoot(playerid, i);


    TrashCans_ID[i] = 0;
    Kommt weg, da überflüssig.


    Jetzt funktioniert es, danke ;)


    _________________________________________________________________________________________________________


    EDIT: Okay, das war ein Irrtum. Es funktioniert doch nicht. Es hat zunächst bei der ersten Mülltonne geklappt, bei der zweiten nicht mehr.
    Und das auch nur, wenn ich "i" statt "ii" bei SetTimerEx stehen hatte. bei "ii" kann ich nach dem Durchwühlen immer weiter wühlen.


    _________________________________________________________________________________________________________


    EDIT Nr.2: Kleines Update zur Problembeschreibung
    Wenn ich direkt nach dem Durchwühlen nochmal durchwühle, dann wird der Code irgendwie übergangen. Warte ich ein paar ms, dann funktioniert er.


    _________________________________________________________________________________________________________


    EDIT Nr.2: Tut mir Leid, wegen den vielen Edits. :wacko:
    Komischerweise ist es so, dass die Geschichte in Edit Nr.2 (Wiederholtes Durchwühlen einer Trashcan) klappt, wenn ich die Zeilen...


    AlreadySearching[playerid] = false;
    TrashCans_ID[i] = gettime() + 30*60;


    in der Timerfunktion ganz unten habe.


    Ich habe sie nun einmal probeweise gleich an den Anfang der Funktion gesetzt, und siehe da - es klappt. Das führt irgendwie zur Schlussfolgerung, dass die Funktion wohl etwas langsam sein müsste, also habe ich einmal gemessen. Jedoch kamen immer 0ms heraus.
    Also, ich weiß absolut nicht, woran es lag, aber nun klappt es. :thumbup:

    3 Mal editiert, zuletzt von Manyula ()