[Erledigt]Command + Timer -> Warning und falsche "Werte"

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
  • Erledigt, siehe am Ende des Beitrags!


    Hallo Leute!
    Ich bin erst seit kurzem am "Scripten" und habe bisher eigentlich alle Aufgaben gemeistert ...
    Nun bin ich an einen Adminbefehl dran, der einen zuerst aus einer bestimmten Höhe fallen lässt und dann die Differenz von dem Alten und dem Neuen "Leben" ausgibt (SendClientMessage an den ausführenden Admin und per printf an die Konsole).
    Seht selbst, hier mein Code (Habs ein wenig gekürzt 1. wegen Copy&Paste und 2. wegen der Übersichtlichkeit):
    forward DownHP(playerid, seconds, pID, health1);


    public DownHP(playerid, seconds, pID, health1)


    if(seconds > 0)


    seconds = seconds -1;
    SetTimerEx("DownHP", 1000, 0, "iiif", playerid, seconds, pID, health1);
    return 1;


    if(seconds == 0)


    new Adminname[MAX_PLAYER_NAME], pname[MAX_PLAYER_NAME], Float:health, Float:health2, string[256];
    GetPlayerName(playerid, Adminname, sizeof(Adminname));
    GetPlayerName(pID, pname, sizeof(pname));
    GetPlayerHealth(pID, health2);
    health = health1 - health2;
    format(string, sizeof(string), "%s wurde geslapt! %f HP verloren (Admin: %s)", pname, health, Adminname);
    SendClientMessage(playerid, YELLOW, string);
    printf("%s",string);
    SetPlayerHealth(pID, health1);
    return 1;



    dcmd_down(playerid, params[])
    new pID, Float:x, Float:y, Float:z, Float:health1, Float:health2, seconds = 5;


    GetPlayerHealth(pID, health1);
    health2 = health1+100;
    SetPlayerHealth(pID, health2);
    GetPlayerPos(pID, x, y, z);
    SetPlayerPos(pID, x, y, z+20);
    DownHP(playerid, seconds, pID, health1); // <- warning 213: tag mismatch
    return 1;


    Den Warning in Zeile 33 habe ich per "Zufall" wegbekommen (durch "float:health1"), jedoch hat dies nichts an folgenden, für mich nicht nachvollziehbaren Werten, geändert!

    Code
    [21:42:28] Kevin wurde geslapt! 1119747968.000000 HP verloren (Admin: Kevin)
    [21:46:54] Kevin wurde geslapt! -70.000000 HP verloren (Admin: Kevin)
    [21:46:54] [death] Kevin died 54
    [21:47:05] Kevin wurde geslapt! 1120403328.000000 HP verloren (Admin: Kevin)
    [21:47:17] Kevin wurde geslapt! -135.000000 HP verloren (Admin: Kevin)
    [21:47:17] [death] Kevin died 54
    [21:47:17] Kevin wurde geslapt! 1120403328.000000 HP verloren (Admin: Kevin)
    [21:47:19] Kevin wurde geslapt! 1128791936.000000 HP verloren (Admin: Kevin)


    Ich hoffe jemand von euch findet den Fehler!
    Ich bin es wer weiß wie oft durchgegangen, aber leider habe ich keinen einzigen Fehler gefunden ...
    Naja, hier nochmal der Ablauf:
    1. /down [ID] und die Person wird in die Luft teleportiert (zuvor SetPlayerHealth +100, damit die Person nicht ausversehen stirbt)
    2. Nach 5 Sekunden (Timer) wird die "neue" HP ausgelesen und dann die Differenz ausgerechnet (Also eigentlich WIEVIEL die Person verloren hat).
    3. Die HP wird wieder auf "health1" gesetzt (Die Anfangsleben)


    Mit freundlichen Grüßen
    Kevin


    Weitere Infos:
    - Selfmade (Kleiner DM-Server)
    - Command-System: dcmd
    - Windows-Server


    Es lag an (dem "Float:")

    forward DownHP(playerid, seconds, pID, Float:health1);
    public DownHP(playerid, seconds, pID, Float:health1)

    Und hierdran:
    Das ist falsch:
    health = health1 - health2;
    health = health2 - health1;
    Das ist richtig:
    health = (health1 + 100) - health2;

    Einmal editiert, zuletzt von Kevin1 ()

  • Wenn du einen Float als argument überträgst, sollte die angeseuerte Funktion auch einen Float: parameter haben.forward DownHP(playerid, seconds, pID, Float:health1);
    public DownHP(playerid, seconds, pID, Float:health1)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Wenn du einen Float als argument überträgst, sollte die angeseuerte Funktion auch einen Float: parameter haben.forward DownHP(playerid, seconds, pID, Float:health1);
    public DownHP(playerid, seconds, pID, Float:health1)

    Mmmh, dachte eigentlich das hätte ich schon ausprobiert oO
    Naja, mal gucken!
    Danke schonmal, das Ergebnis poste ich gleich hier rein!
    Hoffentlich gehts :)


    MfG Kevin


    VIELEN DANK :)
    Es klappt!
    Jedenfalls habe ich jetzt nurnoch ein kleines Problem, welches aber wohl an einen Denkfehler von mir zurückzuführen ist!
    "[15:51:06] Kevin wurde geslapt! -62.000000 HP verloren (Admin: Kevin)"
    100HP -> 200HP -> 162 -> 38HP verloren
    Warum Rechnet er 100 - 162 ? :O
    Variablen verdreht!
    health = health1 - health2; -> health = health2 - health1;
    So, nun müsste es gehen!
    So, wieder am Testen!

    Einmal editiert, zuletzt von Kevin1 ()