Problem mit Health-Überprüfung

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
  • Guten Nachmittag an alle Brotfische da draussen,
    wie man vllt. sehen kann bin ich erst seit kurzem eurer Community beigetreten.


    Nun erbitte ich euch folgendes Problem zu lösen.
    Hierbei handelt es sich um einen eigentlich simplen /heal Befehl.


    if(strcmp(strget(cmdtext,0), "/heal", true) == 0)
    {
    if(!IstSpielerAdmin(playerid, 1)) return SendClientMessage(playerid, RED, "SERVER: Du bist kein Admin!");
    {
    new ziel = strval(strget(cmdtext,1));
    if(!IsPlayerConnected(ziel)) return SendClientMessage(playerid, RED, "SERVER: Dieser Spieler ist nicht mit dem Server verbunden!");
    {
    if(!strlen(strget(cmdtext,1))) return SendClientMessage(playerid, RED, "SERVER: Benutze: /heal ID");
    {
    new zielname[512];
    new playername[512];
    new msg[512];
    new msg2[512];
    new Float:health;
    GetPlayerHealth(ziel,health);
    if(health >= 100) return SendClientMessage(playerid, RED, "SERVER: Dieser Spieler muss nicht geheilt werden!"); //Der Fehler liegt denk ich mal hier
    else
    {
    SetPlayerHealth(ziel, 100);
    GetPlayerName(playerid, playername, sizeof(playername));
    GetPlayerName(ziel, zielname, sizeof(zielname));
    format(msg, sizeof(msg), "SERVER: Du hast %s geheilt!", zielname);
    format(msg2, sizeof(msg2), "SERVER: %s hat dich geheilt!", playername);
    SendClientMessage(playerid, RED, msg);
    SendClientMessage(ziel, RED, msg2);
    }
    }
    }
    }
    return 1;
    }


    Nun zum Problem: Falls das "Ziel" 100 HP oder mehr hat soll eine Fehlermeldung wie sie oben bereits steht ausgegeben werden.
    Diese wird aber nicht ausgegeben, wenn das "Ziel" mehr als 100 HP hat; ganz im Gegenteil, das Ziel wird auf 100 HP zurückgesetzt bzw. "geheilt".
    Wenn das "Ziel" genau 100 HP hat, wird diese jedoch ausgegeben und der Spieler nicht geheilt.


    Ich hoffe ihr könnt mir da irgendwie weiterhelfen.


    Danke,
    Mit freundlichen Grüßen,
    dekoration

  • Hey,
    versuche es mal so:
    if(strcmp(strget(cmdtext,0), "/heal", true) == 0)
    {
    if(!IstSpielerAdmin(playerid, 1)) return SendClientMessage(playerid, RED, "SERVER: Du bist kein Admin!");
    new ziel = strval(strget(cmdtext,1));
    if(!IsPlayerConnected(ziel)) return SendClientMessage(playerid, RED, "SERVER: Dieser Spieler ist nicht mit dem Server verbunden!");
    if(!strlen(strget(cmdtext,1))) return SendClientMessage(playerid, RED, "SERVER: Benutze: /heal ID");
    new zielname[512],playername[512],msg[128],Float:health;
    GetPlayerHealth(ziel,health);
    if(health >= 100)return SendClientMessage(playerid, RED, "SERVER: Dieser Spieler muss nicht geheilt werden!");
    SetPlayerHealth(ziel, 100);
    GetPlayerName(playerid, playername, sizeof(playername)), GetPlayerName(ziel, zielname, sizeof(zielname));
    format(msg, sizeof(msg), "SERVER: Du hast %s geheilt!", zielname),SendClientMessage(playerid, RED, msg);
    format(msg, sizeof(msg), "SERVER: %s hat dich geheilt!", playername);
    return SendClientMessage(ziel, RED, msg);
    }
    Du hast ziemlich viele unnötige Klammern gemacht!
    Wenn du etwas returnst, darfst du hinterher keine Klammer auf mehr machen ( direkt danach )
    Beispiel:
    if(!IsPlayerConnected(ziel)) return SendClientMessage(playerid, RED, "SERVER: Dieser Spieler ist nicht mit dem Server verbunden!");
    {
    Das ergibt keinen Sinn!

  • Nein, das brauchst du dort nicht machen..
    Du brichst den Befehl per 'return' doch eh ab ( wenn es nicht den Anforderungen entspricht ), also wozu das 'else'?


    //Edit:
    Trotzdem sind die Klammern ein Fehler, da sie am falschen Ort sind!
    Benutzt du vlt einen Commandprozessor? ( zum Beispiel 'OCMD' )

    Mit freundlichen Grüßen
    ErikSon



    Scripte kleine Systeme auf Anfrage umsonst!
    Per PN könnt ihr mir gerne Scriptingfragen stellen.

    Einmal editiert, zuletzt von ErikSon ()

  • Dann benutze mal 'strtok'..
    if(strcmp(strget(cmdtext,0), "/heal", true) == 0)
    {
    if(!IstSpielerAdmin(playerid, 1)) return SendClientMessage(playerid, RED, "SERVER: Du bist kein Admin!");
    new idx,tmp[64], ziel;
    tmp = strtok(cmdtext,idx); ziel = strval(tmp);
    if(!IsPlayerConnected(ziel)) return SendClientMessage(playerid, RED, "SERVER: Dieser Spieler ist nicht mit dem Server verbunden!");
    if(!strlen(strget(cmdtext,1))) return SendClientMessage(playerid, RED, "SERVER: Benutze: /heal ID");
    new zielname[16],playername[16],msg[128],Float:health;
    GetPlayerHealth(ziel,health);
    if(health >= 100)return SendClientMessage(playerid, RED, "SERVER: Dieser Spieler muss nicht geheilt werden!");
    SetPlayerHealth(ziel, 100);
    GetPlayerName(playerid, playername, sizeof(playername)), GetPlayerName(ziel, zielname, sizeof(zielname));
    format(msg, sizeof(msg), "SERVER: Du hast %s geheilt!", zielname),SendClientMessage(playerid, RED, msg);
    format(msg, sizeof(msg), "SERVER: %s hat dich geheilt!", playername);
    return SendClientMessage(ziel, RED, msg);
    }




    strtok(const string[], &index)
    {
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
    index++;
    }

    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }
    result[index - offset] = EOS;
    return result;
    }
    Sollte so richtig sein, verwende selber nie strtok, jedoch ist es anscheinend einfach..


    //Edit: Sorry, vergessen.. Bearbeitet! @Post unten

    Mit freundlichen Grüßen
    ErikSon



    Scripte kleine Systeme auf Anfrage umsonst!
    Per PN könnt ihr mir gerne Scriptingfragen stellen.

    Einmal editiert, zuletzt von ErikSon ()

  • Die Variable "ziel" speichert doch eine playerid, also darf es kein Array sein, sondern ein Integer:
    new ziel;


    Datentypen:
    integer = ganze Zahlen (gibt eine Unter- und Obergrenze, diese liegen aber im negativen, sowie im positiven im Millionenbereich)
    Float = Fließkommazahlen (bspw. 0,33)
    string = Verwendung für Zeichenketten. In PAWN verwendet man dafür char arrays.


    Das sind die Wichtigsten.

  • Ist ja alles schön und gut, aber es funktioniert immer noch nicht..
    Ich denke nicht, dass es an Klammern oder irgendwelchen anderen Kriterien liegen kann ausser dass ich eventuell was falsch beim Befehl formuliert hab.
    Stimmt dieser Befehl an sich. Sollte er das tun was von ihm verlangt wird oder ist da irgendwo ein Fehler. Und damit meine ich den ersten Post. Falsche Klammern ausgeschlossen.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen