Give Weapon Befehl

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
  • Hallo,
    ich habe heute nach ca 2 Jahre langer Pause mein SAMP wieder ausgegraben. Und gleich ein Problem.


    Folgender Befehl funktioniert genauso wie er soll:



    //Give Weapon
    ocmd:gw(playerid,params[])
    {
    if(pInfo[playerid][Rang] > 1)
    {
    new pID,wID,Munni,string[128],string0[128],string1[128],string2[128];
    if(!IsPlayerConnected(pID))return SCM(playerid,ROT,"Der angegebene Spieler ist nicht connected!");
    if(sscanf(params,"uii",pID,wID,Munni))
    {
    if(wID<0 || wID>46 || wID>18 && wID<22)
    {
    SCM(playerid,ROT,"Diese WaffenID ist ungültig!");
    }
    else
    {
    GivePlayerWeapon(pID,wID,99999);
    format(string,sizeof(string),"Du hast %s eine Waffe mit unendlich Munition gegeben.",Spielername(pID));
    format(string0,sizeof(string0),"Du hast von %s eine Waffe mit unendlich Munition bekommen.",Spielername(playerid));
    SCM(playerid,GREEN,string);
    SCM(pID,GREEN,string0);
    }
    }
    else
    {
    if(wID<0 || wID>46 || wID>18 && wID<22)
    {
    SCM(playerid,ROT,"Diese WaffenID ist ungültig!");
    }
    else
    {
    GivePlayerWeapon(pID,wID,Munni);
    format(string1,sizeof(string1),"Du hast %s eine Waffe mit %d Schuss gegeben.",Spielername(pID),Munni);
    format(string2,sizeof(string2),"Du hast von %s eine Waffe mit %d Schuss bekommen.",Spielername(playerid),Munni);
    SCM(playerid,GREEN,string1);
    SCM(pID,GREEN,string2);
    }
    }
    }
    else
    {
    SCM(playerid,ROT,"Du bist leider kein Admin!");
    }
    return 1;
    }


    Ich möchte gern eine Art Abfrage drin haben die mir anzeigt wenn ich "/gw" eingebe wie der Befehl sein soll.



    return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>")


    Sowas in der Art. Wenn ich das aber mit an die übliche Stelle schreibe...



    //Give Weapon
    ocmd:gw(playerid,params[])
    {
    if(pInfo[playerid][Rang] > 1)
    {
    new pID,wID,Munni,string[128],string0[128],string1[128],string2[128];
    if(!IsPlayerConnected(pID))return SCM(playerid,ROT,"Der angegebene Spieler ist nicht connected!");
    if(sscanf(params,"uii",pID,wID,Munni)return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>")) // ### HIER IST DIE ZEILE ###
    {
    if(wID<0 || wID>46 || wID>18 && wID<22)
    {
    SCM(playerid,ROT,"Diese WaffenID ist ungültig!");
    }
    else
    {
    GivePlayerWeapon(pID,wID,99999);
    format(string,sizeof(string),"Du hast %s eine Waffe mit unendlich Munition gegeben.",Spielername(pID));
    format(string0,sizeof(string0),"Du hast von %s eine Waffe mit unendlich Munition bekommen.",Spielername(playerid));
    SCM(playerid,GREEN,string);
    SCM(pID,GREEN,string0);
    }
    }
    else
    {
    if(wID<0 || wID>46 || wID>18 && wID<22)
    {
    SCM(playerid,ROT,"Diese WaffenID ist ungültig!");
    }
    else
    {
    GivePlayerWeapon(pID,wID,Munni);
    format(string1,sizeof(string1),"Du hast %s eine Waffe mit %d Schuss gegeben.",Spielername(pID),Munni);
    format(string2,sizeof(string2),"Du hast von %s eine Waffe mit %d Schuss bekommen.",Spielername(playerid),Munni);
    SCM(playerid,GREEN,string1);
    SCM(pID,GREEN,string2);
    }
    }
    }
    else
    {
    SCM(playerid,ROT,"Du bist leider kein Admin!");
    }
    return 1;
    }


    ...dann funktioniert es nicht. Kann mir jemand sagen wie ich mein Vorhaben realisieren kann?

  • Danke für die schnelle andtort aber das funktioniert ja nicht.


    Code
    error 001: expected token: ";", but found "{"
    error 029: invalid expression, assumed zero


    Darum habe ich ja den Thread eröffnet

  • if(sscanf(params,"uii",pID,wID,Munni))return SendClientMessage(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>");


    Hab ein Simicolon vergessen ^^


    und hinter der if Abfrage, vor dem return kommen 2 Klammern, hinten nur eine und ein Simicolon^^
    edit: er war schneller ^^

  • ähm...
    wenn ich dort ein ";" setze dann wird die abfrage ja dort beendet aber das ist ja nicht ganz sinn und zweck der sache.


    Habe es gerade getestet und wie ich es mir dachte beim compile kommt beim else ein error...


    wie kann man das noch umsetzen?

  • Beitrag von Jeffry ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Beitrag von theTV ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Jeffry
    Danke dir. Funktioniert bestimmt aber ich habe den weiteren else zweig eigentlich drin weil ich gern die ausgeben "du hast spieler1 eine Waffe mit UNENDLICH Munition gegeben..."
    Das ist so leider nicht mehr möglich. Kann man denn bei meinem "fertigen" Befehl nicht irgendwie mein vorhaben realisieren?


    @thetvMt2
    genau so meine ich es. Und das fehlt leider im Script von Jeffry.



    Hat noch jemand eine Idee wie man es umsetzen kann?

    Einmal editiert, zuletzt von Takiry ()

  • Ah, so meinst du das. Sorry, ich dachte du willst das mit dem unendlich weg haben.


    Hat noch jemand eine Idee wie man es umsetzen kann?


    Der Code von thetvMt2 passt nicht ganz, aber vom Prinzip her stimmt es dann.
    (Die IsPlayerConnected Abfrage war an der falschen Stelle.)


    ocmd:gw(playerid,params[])
    {
    if(pInfo[playerid][Rang] <1)return SCM(playerid,ROT,"Du bist leider kein Admin!");
    new pID,wID,Munni,string[144];
    if(sscanf(params,"uiI(-1)",pID,wID,Munni)return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>");
    if(!IsPlayerConnected(pID))return SCM(playerid,ROT,"Der angegebene Spieler ist nicht connected!");
    if(wID<0 || wID>46 || wID>18 && wID<22)return SCM(playerid,ROT,"Diese WaffenID ist ungültig!");
    if(Munni==-1)//hat er keine Munition angegeben, dann ....
    {
    GivePlayerWeapon(pID,wID,99999);
    format(string,sizeof(string),"Du hast %s eine Waffe mit unendlich Munition gegeben.",Spielername(pID));
    SCM(playerid,GREEN,string);
    format(string,sizeof(string),"Du hast von %s eine Waffe mit unendlich Munition bekommen.",Spielername(playerid));
    SCM(pID,GREEN,string);
    }
    else //Er hat Munition angegeben
    {
    GivePlayerWeapon(pID,wID,Munni);
    format(string,sizeof(string),"Du hast %s eine Waffe mit %d Schuss gegeben.",Spielername(pID),Munni);
    SCM(playerid,GREEN,string);
    format(string,sizeof(string),"Du hast von %s eine Waffe mit %d Schuss bekommen.",Spielername(playerid),Munni);
    SCM(pID,GREEN,string);
    }
    return 1;
    }

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • ja danke. irgendwas stimmt immer noch nicht. Klammern und ";" sind scheinbar nicht richtig,


    Ich habe es nun so hier umgestellt:


    ocmd:gw(playerid,params[])
    {
    if(pInfo[playerid][Rang] <1)return SCM(playerid,ROT,"Du bist leider kein Admin!");
    new pID,wID,Munni,string[128],string0[128],string1[128],string2[128];
    if(!IsPlayerConnected(pID))return SCM(playerid,ROT,"Der angegebene Spieler ist nicht connected!");
    if(sscanf(params,"uiI(-1)",pID,wID,Munni))return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>");
    if(wID<0 || wID>46 || wID>18 && wID<22)return SCM(playerid,ROT,"Diese WaffenID ist ungültig!");
    if(Munni==-1)
    {
    GivePlayerWeapon(pID,wID,99999);
    format(string,sizeof(string),"Du hast %s eine Waffe mit unendlich Munition gegeben.",Spielername(pID));
    format(string0,sizeof(string0),"Du hast von %s eine Waffe mit unendlich Munition bekommen.",Spielername(playerid));
    SCM(playerid,GREEN,string);
    SCM(pID,GREEN,string0);
    }
    else
    {
    GivePlayerWeapon(pID,wID,Munni);
    format(string1,sizeof(string1),"Du hast %s eine Waffe mit %d Schuss gegeben.",Spielername(pID),Munni);
    format(string2,sizeof(string2),"Du hast von %s eine Waffe mit %d Schuss bekommen.",Spielername(playerid),Munni);
    SCM(playerid,GREEN,string1);
    SCM(pID,GREEN,string2);
    }
    return 1;
    }


    Mit dem Playerconnect teste ich jetzt nochmal aber ich glaube nicht das es anders wird, bei mir kommt jetzt nur noch die ausgabe: "INFO: /gw [PlayerID] [WaffenID] <Munition>" egal ob mit oder ohne munition oder gültiger WaffenID / PlayerID oder sonst was...

  • So über folgende antwort werdet ihr lachen...


    Ich habe Sscanf nie als Plugin bessen ?!?


    alles was bei mir mit sscanf zu tun hat ist folgende Zeile in meinem Script:
    #include <sscanf>


    Das wars. Seit wann gibt es das auch als Plugin? ist das unbedingt nötig? kann ich denn nicht weiterhin mein script so nutzen wie es bisher auch genutzt wird? wenn ich unbedingt das plugin brauche dann lass ich lieber die abfrage raus und habe halt keine hilfe anzeige wenn jemand gw eingibt. das wäre sehr schade aber wenn es so nicht geht dann ist dies nicht so schlimm.


    //Edit: und ja die aktuelle .inc datei verwende ich

  • Das geht nur mit dem Plugin.
    Wenn du das Plugin nicht haben willst (da kann ich dich voll und ganz verstehen, ich will es auch nicht haben), dann nutze strtok. Ist zwar etwas mehr Code, aber dafür viel flexibler:


    ocmd:gw(playerid,params[])
    {
    if(pInfo[playerid][Rang] <1) return SCM(playerid,ROT,"Du bist leider kein Admin!");
    new string[144],pID,wID, Munni, tmp[20], tmp2[20], tmp3[20], idx;
    tmp = strtok(params, idx);
    tmp2 = strtok(params, idx);
    if(!strlen(tmp2) || !IsNumeric(tmp2)) return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>");
    if(IsNumeric(tmp)) pID = strval(tmp);
    else pID = ReturnPlayerID(tmp);
    if(!IsPlayerConnected(pID))return SCM(playerid,ROT,"Der angegebene Spieler ist nicht connected!");
    wID = strval(tmp2);
    if(wID<0 || wID>46 || wID>18 && wID<22) return SCM(playerid,ROT,"Diese WaffenID ist ungültig!");
    tmp3 = strtok(params, idx);
    if(!strlen(tmp3))//hat er keine Munition angegeben, dann ....
    {
    GivePlayerWeapon(pID,wID,99999);
    format(string,sizeof(string),"Du hast %s eine Waffe mit unendlich Munition gegeben.",Spielername(pID));
    SCM(playerid,GREEN,string);
    format(string,sizeof(string),"Du hast von %s eine Waffe mit unendlich Munition bekommen.",Spielername(playerid));
    SCM(pID,GREEN,string);
    }
    else //Er hat Munition angegeben
    {
    Munni = strval(tmp3);
    GivePlayerWeapon(pID,wID,Munni);
    format(string,sizeof(string),"Du hast %s eine Waffe mit %d Schuss gegeben.",Spielername(pID),Munni);
    SCM(playerid,GREEN,string);
    format(string,sizeof(string),"Du hast von %s eine Waffe mit %d Schuss bekommen.",Spielername(playerid),Munni);
    SCM(pID,GREEN,string);
    }
    return 1;
    }



    Einmalig unten im Gamemode einfügen:

    Spoiler anzeigen
    stock strtok(const string[], &index) //©Jeffry
    {
    new result[20], length = strlen(string), i = index;
    while ((i < length) && (string[i] == ' ')) i++;
    strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
    index++;
    return result;
    }

    Spoiler anzeigen
    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }

    Spoiler anzeigen
    stock IsNumeric(string[])
    {
    for (new i = 0, j = strlen(string); i < j; i++)
    {
    if ((string[i] > '9' || string[i] < '0')) return 0;
    }
    return 1;
    }

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Ich glaube ich lasse es beim alten.


    Ich habe nach wie vor die Error mit Klammersetzung / semikolonsetzung und wenn ich die errors nach meinem Wissen entferne funktioniert der Script nicht wie er soll.


    Ich bedanke mich für eure Mühe aber leider klappt das nicht so wie ich es gern hätte.

  • Kann ich gern machen:


    Code
    error 001: expected token: ";", but found ")"
    error 029: invalid expression, assumed zero
    warning 215: expression has no effect
    error 001: expected token: ";", but found "if"
    fatal error 107: too many error messages on one line


    Betrifft alles die Zeile:


    if(!strlen(tmp2) || !IsNumeric(tmp2)) return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>"))


    bzw beim 3. Error die Zeilen:


    if(!strlen(tmp2) || !IsNumeric(tmp2)) return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>"))
    if(IsNumeric(tmp)) pID = strval(tmp);



    Komplett ist es 1zu1 von Jeffry kopiert

  • if(!strlen(tmp2) || !IsNumeric(tmp2)) return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>"))


    zu:
    if(!strlen(tmp2) || !IsNumeric(tmp2)) return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>");



    Ich hatte wohl den falschen Code in der Zwischenablage, kommt davon wenn man nur Copy Paste macht (ich). ;(

  • nun noch ein was.


    wirs strtok schon irgendwo definiert? Also ich meine jetzt seit der 03z version oder vlt in einem include?


    Ich habe es nur einmal im Script drin und trotzdem kommt


    Code
    symbol already defined: "strtok"



    Wenn ich es raus nehmen


    Also das hier:
    stock strtok(const string[], &index) //©Jeffry
    {
    new result[20], length = strlen(string), i = index;
    while ((i < length) && (string[i] == ' ')) i++;
    strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
    index++;
    return result;
    }
    Dann klappt es. ich schau mal wie es im spiel aussieht.


    Edit:
    Ja so funktioniert es 10 millionen mal Danke dafür. Ich gebe es zu ich sehe da zwar nciht mehr durch aber muss ich ja jetzt auch nicht mehr :D. Für mich war es heute ein langer Tag ich gehe mal ins Bett und schau mir das morgen nochmal genau an. Wie ihr merkt habe ich ja kaum noch was vom scripten im hirn... Die SAMP Pause war wohl bei mir zu lange :D


    Danke nochmal :thumbup:

    Einmal editiert, zuletzt von Takiry ()