Auftrags ID zuweisen

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 zusammen


    Ich möchte dem jeweiligen Auftrag per /service eine ID zuweisen


    es soll dabei NICHT bei den annahme stellen unterschieden werden, also reicht eine Schleife


    new Auftraege[200];


    if(dialogid == DIALOG_SERVICE)
    {
    if(response)
    {
    for(new b=1; b<Auftraege; b++)
    {


    }
    if(listitem == 0)
    {
    return 1;



    jetzt ist meine Frage wie weise ich das ganze zu? es soll wie in der DB ablaufen also Auto Increnement


    vlt könnt ihr mir ja einen Anstups geben


    Jeffry kannst du vlt helfen?

    Handy Vertrag?
    Hier kannst du was gutes Finden!


    Klick mich an!

    2 Mal editiert, zuletzt von [RG]Stormi25 () aus folgendem Grund: code fehler behoben schleife umgestellt

  • Du erstellst einfach eine globale Variable und lässt diese pro Auftrag um 1 wachsen, der Wert der Variable ist dann deine Auftragsnummer.


    Also:

    new contractid;
    contractid++;

    20€ geschenkt - bei Fragen gerne PN an mich


    Mehr über reCyclix
    reCyclix - more than recycling
    reyCyclix ist ein polnisches Recyclingunternehmen, welches jedem die Möglichkeit bietet, sich an ihrem Geschäftsmodell gewinnbringend zu beteiligen. Normalerweise passiert das, in dem man eine beliebige Summe in Kunststoffmüll investiert, allerdings schenkt reCyclix zur Zeit noch jedem neuem Nutzer 20€, die zur Investition genutzt werden können.


  • new contract[MAX_PLAYERS] = 0;


    contract[playerid] = contractid;


    //Zum Abfragen dann später:
    if(!contract[pID]) return SendClientMessage(playerid,-1,"Der Spieler hat keinen Auftrag erstellt!");
    else {
    format(string,sizeof string,"Der Spieler %s hat den Auftrag %d.",SpielerName(pID),contract[pID]);
    SendClientMessage(playerid,-1,string); }
    }



    Also so kannst du dann die Auftragsnummer der einzelnen Spieler überprüfen..


    Hoffe du verstehst, wie ich das meine..

    20€ geschenkt - bei Fragen gerne PN an mich


    Mehr über reCyclix
    reCyclix - more than recycling
    reyCyclix ist ein polnisches Recyclingunternehmen, welches jedem die Möglichkeit bietet, sich an ihrem Geschäftsmodell gewinnbringend zu beteiligen. Normalerweise passiert das, in dem man eine beliebige Summe in Kunststoffmüll investiert, allerdings schenkt reCyclix zur Zeit noch jedem neuem Nutzer 20€, die zur Investition genutzt werden können.

  • Guten Abend :=)


    Wenn ich dich richtig verstehe, möchtest du, dass für jeden neuen /Service Auftrag, eine eindeutige ID erstellt wird, die dann wahrscheinlich später abgefragt werden kann. Nun, wenn ich dich richtig verstehe, wäre dies hier ein möglicher Lösungsansatz:


    #define MAX_AUFTRAG 200


    enum AuftragInhalt {
    AuftragGeber[40], Belegt
    };


    new Auftrag[MAX_AUFTRAG][AuftragInhalt];



    for(new b=1; b<MAX_AUFTRAG; b++)
    {
    if (Auftrag[b][Belegt] == 0)
    {
    new string[40];
    GetPlayerName(playerid,string);
    Auftrag[b][Belegt] = 1;
    format(Auftrag[b][AuftragGeber],40,string);
    return 1;
    }
    }



    Ich hoffe ich habe dich richtig Verstanden, und konnte dir eine richtige Richtung aufzeigen. Der Code ist übrigend ungetested, also keine Garantie :P


    MfG Madretsma


    IM AUFBAU!

  • //Zum Abfragen dann später:


    da müsste ich ja dann mit sscanf ne abfrage machen oder?


    ich möchte ja bei /accept service das dort die liste mit den Aufträgen erscheint (die offenen mit ID angezeigt)


    dann bei auswahl soll die der Auftrag auf 2 gesetzt werden also in arbeit ( 1 ist = ID in Auftrag gegeben)



    beim Abschluss dann wieder auf -1 als ERLEDIGT



    weißt du was ich meine?

  • Als Antwort auf deine PN:



    Du kannst oben in der "enum" noch Variablen hinzufügen, die dann jedem Auftrag "als Eigenschaft zur Verfügung stehen". Füge dort z.B, ein "Vergeben" und ein "Erledigt" ein. Diesen Variablen kannst du dann bestimmte Werte zuweisen, je nach dem, welchen Sinn und Zweck sie haben. Wichtig ist, dass du verstehst, dass die Zeile mit dem
    new Auftrag[MAX_AUFTRAG][AuftragInhalt];
    deine Aufträge in einem 2 Dimensionalem Array erstellt, d.h. dass erste "MAX_AUFTRAG" gibt die maximale Größe (Anzahl) an, und das zweite "AuftragInhalt" gibt jedem dieser Aufträge dann die Variablen sozusagen als Eigenschaften, die innerhalb der enum stehen.


    Wenn du später dann eine Abfrage machen willst, die alle Verfügbaren Auftäge listet, machst du einfach eine Schleife, die jeden Auftrag durchgeht, und abfragt ob dieser bereits Vergeben, bzw. Erledigt ist - Wenn nicht, mit in die Liste.


    Btw: Ich habe als Antwort auf deine PN diesen Post verfasst, da ich denke, dass viele "Neulinge" (Absolut nicht Böse gemeint, zähle mich selbst dazu) sich hier im Forum umschauen und selbst gerne einen Lösungsansatz sehen würden.



    Mit freundlichen Grüßen und in der Hoffnung nicht allzu viele Fehler gemacht zu haben


    Madretsma


    IM AUFBAU!

  • danke Madretsma



    hier mein Ansatz für die Abfrage


    Ich möchte die ganzen in einer Liste darstellen mit ID nummer - die schleife habe ich


    wie mache ich das mit dem Listendialog?


    if(sscanf(params,"s[64]",item))return SendClientMessage(
    playerid, RED, "INFO: /accept [service]");
    if(!strcmp(item, "service", false))
    {
    for(new i=1; i<5000; i++)
    {
    //auftrag[playerid] = auftragsid;
    if(auftrag[playerid] != -1) continue;

    }
    return 1;
    }


    und unten nochmal zur kontrolle

    Klick mich du Nudel
    new auftragsid;
    new auftrag[MAX_PLAYERS] = 0;

    Klick mich du Nudel
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {

    if(dialogid == DIALOG_SERVICE)
    {
    new string[256];
    if(response)
    {
    if(listitem == 0)
    {

    for(new i=0; i<MAX_PLAYERS; i++) //Abschleppdienst rufen\nPolizei rufen\nTaxi rufen\nFeuerwehr rufen!
    {
    if(sInfo[i][fraktion] == 10) continue;
    format(string,sizeof(string),"Der %s:%s hat einen Service gerufen! Die Auftrags ID ist:%i. Nehmen sie den Auftrag mit /accept service an!",GetPlayerAdminName(playerid),SpielerName(playerid),auftragsid);
    SendClientMessage(i,CL_HBLUE,string);
    }
    auftrag[playerid] = auftragsid;
    auftragsid++;
    return 1;
    }


    ps ich hab jetzt erstmal noicht mit dem enum gearbeitet - kann das aber problemlos umschreiben (dat krieg ich hin :D)

  • Guten Morgen, sorry, gestern Abend konnte ich nicht mehr antworten.


    Soweit ich das alles richtig verstehe, müsstest du einfach beispielsweise dem Auftrag Nummer 1 die playerid des Auftraggebers zuweisen. Wenn der Medic zB dann schaut, was für Aufträge verfügbar sind, gehst du alle Aufträge durch und schaust ob ihr Wert ungleich -1 ist. Ist der Wert über -1, dann nimmst ihn mit in die Liste auf, ist er aber -1, dann nicht. Sobald du den Auftrag angenommen hast, setzt den den Auftrag wieder auf -1.


    Ich hoffe das ist verständlich ausgedrückt.


    Mit freundlichen Grüßen


    Madretsma


    EDIT: Ich würde an deiner Stelle mit der enum arbeiten, ist viel übersichtlicher und einfacher :D


    IM AUFBAU!

  • Ich lasse dir mal einen Beispielcode da, schau mal ob du damit was anfangen kannst.


    //Command
    ocmd:service(playerid, params[]){
    if(GetPVarInt(playerid, "service.create"))return SendClientMessage(playerid, -1, "Du hast bereits einen Service angefragt.");
    serviceID++;
    new string_service[70];
    format(string_service, 70, "* %s benötigt einen Service, ID: %i", sendername, serviceID),
    SendClientMessage(id, colorcode, string_service),
    SetPVarInt(playerid, "service.create", 1),
    SetPVarInt(playerid, "service.create.id", serviceID);
    return 1;
    }


    ocmd:acceptservice(playerid, params[]){
    new id;
    if(sscanf(params, "i", id))return SendClientMessage(playerid, -1, "nutze: /acceptservice [auftragsid]");
    for(new i; i < GetMaxPlayers(); i++){
    if(IsPlayerConnected(i) && !IsPlayerNPC(i)){
    if(GetPVarInt(i, "service.create")){
    if(GetPVarInt(i, "service.create.id") == id){
    SetPVarInt(i,"service.create",0),SetPVarInt(playerid,"service.create.id",INVALID_PLAYER_ID);
    //weiteres....
    return 1;
    }
    break;
    }
    }
    }
    return SendClientMessage(playerid, colorcode, "* Niemand benötigt einen Service *");
    }


    mfg :thumbup: