Probleme beim Waffendealer

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
  • Ich habe derzeit folgendes Problem. Die Befehle wie z.b


    /materials deliver
    /materials get Anzahl
    /materials gtake
    /materials put


    funktionieren nicht wirklich.


    Sie werden immer durch irgendwelche sscanf abfragen gestoppt. Hat jemand eine Idee wie man das am besten machen kann ? Hier ein vereinfachter Code teil




    ocmd:materials(playerid,params[])
    {
    if(PlayerInfo[playerid][pLoggedIn]==false) return 1;
    new ding[20], anzahl, string[128];
    if(sscanf(params, "s", ding) || (params, "s", ding,anzahl)) return SendClientMessage(playerid,COLOR_RED,"Fehler");
    {
    if(strcmp(ding, "get", true) == 0)
    {
    if(sscanf(params, "si", ding, anzahl)) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get]");
    {
    if(PlayerInfo[playerid][pJob] != 2) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Waffendealer");
    {

    }
    }
    if(strcmp(ding, "deliver", true) == 0)
    {
    if(PlayerInfo[playerid][pJob] != 2) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Waffendealer");
    {

    }
    }
    if(sscanf(params, "sd", ding, anzahl)) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/delivery/put/gtake/sell]");
    {
    if(strcmp(ding, "put", true) == 0)
    {

    }
    }
    if(sscanf(params, "sd",ding,anzahl)) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/delivery/put/gtake/sell]");
    {
    if(strcmp(ding,"gtake",true) ==0)
    {

    }
    }
    }
    }
    return 1;
    }

  • du hast das alles komplett falsch eingeordnet:



    ocmd:materials(playerid,params[])
    {
    new ding[20], anzahl;
    if(sscanf(params, "s", ding) || (params, "s", ding,anzahl)) return SendClientMessage(playerid,Rot,"Benutze : /materials [Get oder Deliver oder gtake]");
    {
    if(strcmp(ding, "get", true) == 0)
    {
    if(sscanf(params, "si", ding, anzahl)) return SendClientMessage(playerid,Rot,"Benutze /materials [get]");
    {



    }
    }
    else if(strcmp(ding, "deliver", true) == 0)
    {
    if(sscanf(params, "sd", ding, anzahl)) return SendClientMessage(playerid,Rot,"Benutze /materials [get/delivery/put/gtake/sell]");
    {



    }
    }
    else if(strcmp(ding,"gtake",true) ==0)
    {
    if(sscanf(params, "sd",ding,anzahl)) return SendClientMessage(playerid,Rot,"Benutze /materials [get/delivery/put/gtake/sell]");
    {



    }
    }
    }
    return 1;
    }

    Mit freundlichen Grüßen,
    Dachdecker

  • Ich habe das ganze von @Dachdecker mal ausprobiert. Allerdings sofern ich den Wert Anzahl mit sende, kann er den get Befehl nicht identifizieren. Daher ist dies immernoch nicht die erhoffte Problem lösung.


    Ich habe mir wie folgt mal den sscanf Wert printen lassen mit


    printf("Ding:%s Anzahl:%s",ding,anzahl);


    dieser gibt alles richtig aus.


    Vielleicht kann @Jeffry dabei auch behilflich sein

  • ocmd:materials(playerid,params[])
    {
    if(PlayerInfo[playerid][pLoggedIn]==false) return 1;
    new ding[20], anzahl, string[145];
    if(sscanf(params, "sI(-1)", ding, anzahl)) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/deliver/put/gtake/sell] [opt:Anzahl]");

    if(!strcmp(ding, "deliver", true))
    {
    if(PlayerInfo[playerid][pJob] != 2) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Waffendealer");
    //Mach was hier
    return 1;
    }
    else if(!strcmp(ding, "get", true))
    {
    if(anzahl == -1) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials get [Anzahl]");
    if(PlayerInfo[playerid][pJob] != 2) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Waffendealer");
    //Mach was hier
    return 1;
    }
    else if(!strcmp(ding, "put", true))
    {
    if(anzahl == -1) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials put [Anzahl]");
    //Mach was hier
    return 1;
    }
    else if(strcmp(ding,"gtake",true))
    {
    if(anzahl == -1) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials gtake [Anzahl]");
    //Mach was hier
    return 1;
    }
    return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/deliver/put/gtake/sell]");
    }

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • @Jeffry, eine Frage?

    Natürlich, immer her damit!



    Das (-1) sagt aus, das i nur bei Bedarf angegeben werden braucht?

    Jein.
    Das große "i" (I) sagt aus, dass der zweite Eingabeparameter optional ist, aber eine Zahl sein muss, falls angegeben. Das -1 ist der Default-Wert.
    Wird er nicht eingegeben, so erhält in dem sscanf die Variable anzahl den Wert -1 (das in Klammer).
    Wird er eingegeben, dann bekommt anzahl den entsprechenden Wert.

  • Habe das ganze nun mal ausgibig getestet. Nun sagt er mir immer den return von hier


    if(sscanf(params, "sI(-1)", ding, anzahl)) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/deliver/put/gtake/sell] [opt:Anzahl]");

  • Liegt wohl daran, dass der Lösungsvorschlag von Jeffry nur für das sscanf-Plugin zählt und nicht für die einzelne Funktion. Zumindestens vermute ich, dass du die nonplugin Version benutzt, da du bei s keine Arraygröße angegeben hast und das atypisch wäre für die Pluginversion. Falls nicht, google einfach mal sscanf2 samp und ersetz es mit deiner Funktion.

  • Liegt wohl daran, dass der Lösungsvorschlag von Jeffry nur für das sscanf-Plugin zählt und nicht für die einzelne Funktion. Zumindestens vermute ich, dass du die nonplugin Version benutzt, da du bei s keine Arraygröße angegeben hast und das atypisch wäre für die Pluginversion. Falls nicht, google einfach mal sscanf2 samp und ersetz es mit deiner Funktion.

    Ich habe mir die Anzahl mal an bestimmter Stelle Printen lassen.


    Der Print gibt folgendes aus


    Anzahl:0


    ich besitze das sscanf plugin version 2

  • Dann versuche es so:if(sscanf(params, "s[20]I(-1)", ding, anzahl)) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/deliver/put/gtake/sell] [opt:Anzahl]");

    Dies löst leider nicht das Problem. Ein Print gibt Allgemein aus das es immer null ist

  • Wie sieht denn dein Befehl komplett mit print aus?
    Sicher, dass du das Plugin nutzt, und nicht im Code doch noch die Funktion irgendwo definiert hast?

    mein code sieht folgendermaßen aus




    ocmd:materials(playerid,params[])
    {
    if(PlayerInfo[playerid][pLoggedIn]==false) return 1;
    new ding[20], anzahl, string[145];
    if(sscanf(params, "s[20]I(-1)", ding, anzahl)) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/deliver/put/gtake/sell] [opt:Anzahl]");
    {
    format(string,sizeof(string),"Anzahl: %i",anzahl);
    SendClientMessage(playerid,COLOR_GREEN,string);
    if(!strcmp(ding, "deliver", true))
    {
    if(IsPlayerInRangeOfPoint(playerid,2.5,-2027.7643,-40.7760,38.8047))
    {
    if(PlayerInfo[playerid][pJob] != 2) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Waffendealer");
    {
    if(PlayerInfo[playerid][pMatskauf] == 0) return SendClientMessage(playerid,COLOR_RED,"Du hast dir keine Mats gekauft");
    {
    PlayerInfo[playerid][pMats] = PlayerInfo[playerid][pMatskauf]*75;
    PlayerInfo[playerid][pMatskauf] = 0;
    format(string,sizeof(string),"Du hast %d Mats erhalten.",PlayerInfo[playerid][pMats]);
    SendClientMessage(playerid,COLOR_GREEN,string);
    format(string, sizeof(string), "%s hat %i Mats abgeholt", PlayerInfo[playerid][pName],PlayerInfo[playerid][pMatskauf]*75);
    SaveToLog("Matsabholen", string);
    }
    }
    }
    return 1;
    }
    else if(!strcmp(ding, "get", true))
    {
    if(anzahl == -1) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials get [Anzahl]");
    if(IsPlayerInRangeOfPoint(playerid,2.5,597.3653,-1249.4796,18.3040))
    {
    if(PlayerInfo[playerid][pJob] != 2) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Waffendealer");
    {
    if(anzahl*3800 > PlayerInfo[playerid][pMoney]) return SendClientMessage(playerid,COLOR_RED,"Du trägst nicht genug Geld bei dir!");
    if(anzahl == 0) return SendClientMessage(playerid,COLOR_RED,"Du hast eine Ungültige Eingabe getätigt.");
    if(anzahl > 10) return SendClientMessage(playerid,COLOR_RED,"Du kannst nicht mehr als 10 Mat Pakete kaufen!");
    if(PlayerInfo[playerid][pMatskauf]>0) return SendClientMessage(playerid,COLOR_RED,"Hole deine bereits gekauften Mats zuerst ab!");
    PlayerInfo[playerid][pMoney]-=anzahl*3800;
    GivePlayerMoney(playerid,-anzahl*3800);
    PlayerInfo[playerid][pMatskauf] = anzahl;
    format(string,sizeof(string),"Du hast dir %d Matspackete für %d$ gekauft. Hole nun deine Mats ab. Der Abholpunkt wurde dir auf der Map markiert.",anzahl,anzahl*5);
    SendClientMessage(playerid,COLOR_GREEN,string);
    SendClientMessage(playerid,COLOR_RED,"Lass dich nicht erwischen. Dies könnte teuer enden.");
    SendClientMessage(playerid,COLOR_GREEN,"Solltest du dich Ausloggen ohne deine Mats zuvor abgeholt zu haben, verfallen diese ohne Ausnahmen!");
    SetPlayerCheckpoint(playerid,-2027.7643,-40.7760,38.8047, 3.0);
    format(string, sizeof(string), "%s hat sich %i Mats gekauft. Preis: %i",getPlayerName(playerid),anzahl,anzahl*750);
    SaveToLog("Matskauflog", string);
    }
    }
    return 1;
    }
    else if(!strcmp(ding, "put", true))
    {
    if(anzahl == -1) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials put [Anzahl]");
    if(anzahl > PlayerInfo[playerid][pMats]) return SendClientMessage(playerid,COLOR_RED,"Du hast nicht genug Mats dabei.");
    PlayerInfo[playerid][pMats] -= anzahl;
    PlayerInfo[playerid][pMatss] += anzahl;
    format(string,sizeof(string),"Du hast %d Mats in den Safe gepackt. Gesamt: %d",anzahl,PlayerInfo[playerid][pMatss]);
    SendClientMessage(playerid,COLOR_GREEN,string);
    SaveUserStats(playerid);
    new string2[128];
    format(string2,sizeof(string2),"%s hat %d Mats in den Safe gepackt. Gesamt: %d",getPlayerName(playerid),PlayerInfo[playerid][pMatss],anzahl);
    SaveToLog("Putmats", string2);
    return 1;
    }
    else if(!strcmp(ding,"gtake",true))
    {
    if(anzahl == -1) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials gtake [Anzahl]");
    if(anzahl > PlayerInfo[playerid][pMatss]) return SendClientMessage(playerid,COLOR_RED,"Du besitzt nicht soviele Mats");
    PlayerInfo[playerid][pMats] += anzahl;
    PlayerInfo[playerid][pMatss] -= anzahl;
    format(string,sizeof(string),"Du hast %d Mats aus den Safe genommen. Gesamt: %d",anzahl,PlayerInfo[playerid][pMatss]);
    SendClientMessage(playerid,COLOR_GREEN,string);
    SaveUserStats(playerid);
    return 1;
    }
    }
    return 1;
    }


    und ich habe nochmal geguckt ich verwende die erste sscanf version also nicht die sscanf2

  • Mit der alten Version klappt das dann wahrscheinlich nicht.
    Versuche es so:
    ocmd:materials(playerid,params[])
    {
    if(PlayerInfo[playerid][pLoggedIn]==false) return 1;
    new ding[20], anzahl, string[145];
    if(sscanf(params, "s", ding)) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/deliver/put/gtake/sell] [opt:Anzahl]");

    if(!strcmp(ding, "deliver", true))
    {
    if(IsPlayerInRangeOfPoint(playerid,2.5,-2027.7643,-40.7760,38.8047))
    {
    if(PlayerInfo[playerid][pJob] != 2) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Waffendealer");
    {
    if(PlayerInfo[playerid][pMatskauf] == 0) return SendClientMessage(playerid,COLOR_RED,"Du hast dir keine Mats gekauft");
    {
    PlayerInfo[playerid][pMats] = PlayerInfo[playerid][pMatskauf]*75;
    PlayerInfo[playerid][pMatskauf] = 0;
    format(string,sizeof(string),"Du hast %d Mats erhalten.",PlayerInfo[playerid][pMats]);
    SendClientMessage(playerid,COLOR_GREEN,string);
    format(string, sizeof(string), "%s hat %i Mats abgeholt", PlayerInfo[playerid][pName],PlayerInfo[playerid][pMatskauf]*75);
    SaveToLog("Matsabholen", string);
    }
    }
    }
    return 1;
    }

    if(sscanf(params, "sd", ding, anzahl)) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/deliver/put/gtake/sell] [opt:Anzahl]");
    format(string,sizeof(string),"Anzahl: %i",anzahl);
    SendClientMessage(playerid,COLOR_GREEN,string);
    if(!strcmp(ding, "get", true))
    {
    if(IsPlayerInRangeOfPoint(playerid,2.5,597.3653,-1249.4796,18.3040))
    {
    if(PlayerInfo[playerid][pJob] != 2) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Waffendealer");
    {
    if(anzahl*3800 > PlayerInfo[playerid][pMoney]) return SendClientMessage(playerid,COLOR_RED,"Du trägst nicht genug Geld bei dir!");
    if(anzahl == 0) return SendClientMessage(playerid,COLOR_RED,"Du hast eine Ungültige Eingabe getätigt.");
    if(anzahl > 10) return SendClientMessage(playerid,COLOR_RED,"Du kannst nicht mehr als 10 Mat Pakete kaufen!");
    if(PlayerInfo[playerid][pMatskauf]>0) return SendClientMessage(playerid,COLOR_RED,"Hole deine bereits gekauften Mats zuerst ab!");
    PlayerInfo[playerid][pMoney]-=anzahl*3800;
    GivePlayerMoney(playerid,-anzahl*3800);
    PlayerInfo[playerid][pMatskauf] = anzahl;
    format(string,sizeof(string),"Du hast dir %d Matspackete für %d$ gekauft. Hole nun deine Mats ab. Der Abholpunkt wurde dir auf der Map markiert.",anzahl,anzahl*5);
    SendClientMessage(playerid,COLOR_GREEN,string);
    SendClientMessage(playerid,COLOR_RED,"Lass dich nicht erwischen. Dies könnte teuer enden.");
    SendClientMessage(playerid,COLOR_GREEN,"Solltest du dich Ausloggen ohne deine Mats zuvor abgeholt zu haben, verfallen diese ohne Ausnahmen!");
    SetPlayerCheckpoint(playerid,-2027.7643,-40.7760,38.8047, 3.0);
    format(string, sizeof(string), "%s hat sich %i Mats gekauft. Preis: %i",getPlayerName(playerid),anzahl,anzahl*750);
    SaveToLog("Matskauflog", string);
    }
    }
    return 1;
    }
    else if(!strcmp(ding, "put", true))
    {
    if(anzahl > PlayerInfo[playerid][pMats]) return SendClientMessage(playerid,COLOR_RED,"Du hast nicht genug Mats dabei.");
    PlayerInfo[playerid][pMats] -= anzahl;
    PlayerInfo[playerid][pMatss] += anzahl;
    format(string,sizeof(string),"Du hast %d Mats in den Safe gepackt. Gesamt: %d",anzahl,PlayerInfo[playerid][pMatss]);
    SendClientMessage(playerid,COLOR_GREEN,string);
    SaveUserStats(playerid);
    new string2[128];
    format(string2,sizeof(string2),"%s hat %d Mats in den Safe gepackt. Gesamt: %d",getPlayerName(playerid),PlayerInfo[playerid][pMatss],anzahl);
    SaveToLog("Putmats", string2);
    return 1;
    }
    else if(!strcmp(ding,"gtake",true))
    {
    if(anzahl > PlayerInfo[playerid][pMatss]) return SendClientMessage(playerid,COLOR_RED,"Du besitzt nicht soviele Mats");
    PlayerInfo[playerid][pMats] += anzahl;
    PlayerInfo[playerid][pMatss] -= anzahl;
    format(string,sizeof(string),"Du hast %d Mats aus den Safe genommen. Gesamt: %d",anzahl,PlayerInfo[playerid][pMatss]);
    SendClientMessage(playerid,COLOR_GREEN,string);
    SaveUserStats(playerid);
    return 1;
    }
    return 1;
    }