Auftragsliste?

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 ein Hitmansystem erstellt.
    Nun wenn jemand einen Auftrag 'macht', kriegt der Hitman eine Nachricht mit Infos, Kopfgeld etc.


    Dies wird an jeden Hitman gesendet der Online ist.
    Allerdings hätte ich es gerne, das das ganze in einer "Auftragsliste" drin ist


    ocmd:hcomputer(playerid,params[])
    {
    ShowPlayerDialog(playerid,DIALOG_HCOMPUTER,DIALOG_STYLE_LIST,"Hitware v0.1", "Auftrag 1\nAuftrag 2\nAuftrag 3\nAuftrag 4\nAuftrag 5", "Okay", "Herunterfahren");
    return 1;
    }


    Wenn ein Auftrag da währe, würde es in Auftrag 1 gehen. Wenn ein 2. dann einen Auftrag macht, kommt der in Auftrag 2.
    Wenn ich jetzt auf Auftrag 1 klicke, sollten die Infos, die der Spieler eingibt (Die zurzeit noch als msg ankommen) drin stehen.
    Wenn ich dann auf "Annehmen" klicke, sollte dem Auftraggeber das Geld abgezogen werden & dem Opfer pKopfgeld auf 1 gesetzt werden!


    Ich weiss leider nicht wie ich das anstelle..


    MFG

  • Du hast doch sicher ein Array, in welchem alle Aufträge gespeichert werden, oder?



    new str[500];
    for(new i = 0; i<sizeof(contractArray); i++){
    format(str, sizeof(str), "%s\n%s", str, contractArray[i]);
    }


    Wenn nun die Einträge "Bla1", "Bla2" und "Bla3" vorhanden wären, würde in der Variable
    "str" nun Bla1\nBla2\nBla3 stehen.


    //E: ggf. noch in der Schleife abfragen, ob im Arrayfeld etwas drin ist.


  • ocmd:hcomputer(playerid,params[])
    {
    ShowPlayerDialog(playerid,DIALOG_HCOMPUTER,DIALOG_STYLE_LIST,"Hitware v0.1", "Auftrag 1\nAuftrag 2\nAuftrag 3\nAuftrag 4\nAuftrag 5", "Okay", "Herunterfahren");
    new str[500];
    for(new i = 0; i<sizeof(contractArray); i++){
    format(str, sizeof(str), "%s\n%s", str, contractArray[i]);
    }
    return 1;
    }

    so?


    MFG

  • Hallo,
    witzig, das gerade das Problem hier angesprochen wird, denn ich bin während des Scriptens auf ein ähnliches gestoßen.
    Allerdings habe ich es bei mir etwas dynamischer gestaltet, sodass die leeren Aufträge etc. nicht angezeigt wird, außer wenn diese erstellt wurden.


    Nichts desto trotz, hier mein Lösungsansatz:

    ocmd:hcomputer(playerid, params[]) {
    new string[128];
    for(new i; i<sizeof(contractArray); i++) {
    strcat(string, contractArray[i]); // Füge dem String den Inhalt von contractArray[i] hinzu
    strcat(string, "\n"); // Füge den String \n (Umbruch) hinzu
    }
    ShowPlayerDialog(playerid, DIALOG_HCOMPUTER, DIALOG_STYLE_LIST, "Hitware v0.1", string, "Okay", "Herunterfahren"); // Dann benutzt zu den String, um ihn als Liste im Dialog anzuzeigen
    }


    Mit freundlichem Gruß,
    der lange nicht aktive D4rk :)

  • D4rkZ3r0x


    Wo soll ich ContractArray definieren?


    Bekomme folgende Errors:

    C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(1187) : error 017: undefined symbol "contractArray"
    C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(1187) : error 036: empty statement
    C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(1187) : error 017: undefined symbol "i"
    C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(1187) : fatal error 107: too many error messages on one line


    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    4 Errors.



    Code:

    ocmd:hcomputer(playerid, params[]) {
    new string[128];
    for(new i; i<sizeof(contractArray); i++) {
    strcat(string, contractArray[i]); // Füge dem String den Inhalt von contractArray[i] hinzu
    strcat(string, "\n"); // Füge den String \n (Umbruch) hinzu
    }
    ShowPlayerDialog(playerid, DIALOG_HCOMPUTER, DIALOG_STYLE_LIST, "Hitware v0.1", string, "Okay", "Herunterfahren"); // Dann benutzt zu den String, um ihn als Liste im Dialog anzuzeigen
    }


    MFG

  • contractArray ist das Array wo die Aufträge gespeichert sind.
    Falls du noch keines definiert hast würde ich das am Besten irgendwo am Anfang vom Script machen.


    Und wenn ein Benutzer dann einen Auftrag erstellt fügst du es dem Array hinzu.

    #define MAX_CONTRACTS 5 // Maximale Anzahl an Aufträgen
    new contractArray[MAX_CONTRACTS][64]; // Hier wird dann das Array initialisiert (2-dimensional, da du einen String speichern willst)


    ocmd:hitman(playerid, params[]) {
    // Hier das sscanf-Zeug mit dem ich leider nicht mehr so vertraut bin da ich meinen eigenen Prozess gescriptet habe
    for(new i; i<MAX_CONTRACTS; i++) { // MAX_CONTRACTS durchlaufen
    if(!strlen(contractArray[i])) { // Prüfen ob der i-te Auftrag bereits belegt ist (ob der string eine länge hat)
    format(contractArray, sizeof(contractArray), "Auftrag %i", i); // Hier formatierst du dann den Auftrag mit der aktuellen Auftragsnummer oder halt irgendwie anders ^^
    break; // Wenn der Auftrag erstellt wurde können wir aufhören, die MAX_CONTRACTS durchzugehen
    }
    }
    }


    Du kannst das Array eventuell auch noch weiter dimensionieren wenn du noch weitere Sachen wie zum Beispiel Auftraggeber o.a. speichern möchtest.
    Ich hoffe damit kommst du einigermaßen zurecht :P

    Einmal editiert, zuletzt von D4rkZ3r0x () aus folgendem Grund: Fehlöör

  • Vielen Dank! Die Errors sind weg. Allerdings hab ich noch 2 Warnings, die irgendwie seltsam sind..



    C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(21883) : warning 203: symbol is never used: "contracts"
    C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(21883) : warning 203: symbol is never used: "hitman"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    2 Warnings.


    Das seltsame daran ist, das das Script nur bis Zeile 21882 geht? o.o


    MFG

  • Ups, ich habe auch noch 2 Fehler entdeckt :)
    Du benutzt anscheinend ocmd, dann anstatt dem cmd:hitman ein ocmd:hitman,
    und den Integer contracts kannst du entfernen, er wird nicht gebraucht.

  • C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(114) : error 048: array dimensions do not match
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    1 Error.



    Zeile:

    format(contractArray, sizeof(contractArray), "Auftrag %i", i);

  • Danke!
    Letze Frage :D Wie mach den Code hier zu einem Auftrag?



    if(dialogid == DIALOG_HITMANAUFTRAG4)
    {
    if(response)
    {
    ShowPlayerDialog(playerid,DIALOG_HITMANAUFTRAG6,DIALOG_STYLE_MSGBOX,"Hitman.onion"," *- Auftrag abgeschickt, wir melden uns! -* ","Okay","Abbrechen");
    SetPVarString(playerid, "OpferInfos", inputtext);
    new OpferName[128];
    new OpferKopfgeld[128];
    new OpferFraktion[128];
    new OpferAufenthalt[128];
    new OpferInfos[128];
    GetPVarString(playerid, "OpferName", OpferName, sizeof(OpferName));
    GetPVarString(playerid, "OpferKopfgeld", OpferKopfgeld, sizeof(OpferKopfgeld));
    GetPVarString(playerid, "OpferFraktion", OpferFraktion, sizeof(OpferFraktion));
    GetPVarString(playerid, "OpferAufenthalt", OpferAufenthalt, sizeof(OpferAufenthalt));
    GetPVarString(playerid, "OpferInfos", OpferInfos, sizeof(OpferInfos));
    new str[145];
    format(str, sizeof(str), "{FF0000}Auftrag: Opfer: %s - Kopfgeld: %s - Fraktion: %s !", OpferName, OpferKopfgeld, OpferFraktion);
    SendeFraktion(6,WEIS, str);
    format(str, sizeof(str), "{FF0000}Auftrag: {FFFFFF}Aufenthaltsort(e): %s", OpferAufenthalt);
    SendeFraktion(6,WEIS, str);
    format(str, sizeof(str), "{FF0000}Auftrag: {FFFFFF}Sonstige Infos: %s", OpferInfos);
    SendeFraktion(6,WEIS, str);
    format(str, sizeof(str), "{FF0000}Auftrag: {FFFFFF}/hcomputer - Auftrag annehmen");
    SendeFraktion(6,WEIS, str);
    }
    }


    mfg

  • D4rkZ3r0x Funktioniert alles super, danke! :)
    Jetzt wollte ich grad ein Annehmen machen, allerdings komm ich nicht weiter, bzw. bekomme Errors!
    Wenn man einen Auftrag annimmt:

    if(dialogid == DIALOG_HCOMPUTER)
    {
    if(response)
    {
    if(listitem == 0)
    {
    GetPVarString(playerid, "OpferName", OpferName, sizeof(OpferName));
    GetPVarString(playerid, "OpferKopfgeld", OpferKopfgeld, sizeof(OpferKopfgeld));
    new str[145];
    format(str, sizeof(str), "{FF0000}Auftrag: Töte: %s !", OpferName);
    SendeFraktion(6,WEIS, str);
    GivePlayerCash(playerid,%s, OpferKopfgeld);
    }


    Errors:

    C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(13905) : error 017: undefined symbol "OpferName"
    C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(13905) : error 017: undefined symbol "OpferName"
    C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(13905) : error 029: invalid expression, assumed zero
    C:\Users\Yozhi.Rap\Documents\00!A Server SAMP\Server\gamemodes\Selfmade2.0.pwn(13905) : fatal error 107: too many error messages on one line


    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    4 Errors.

    MFG

  • Noch eine Sache, die ich jetzt seid einer halben Stunde versuche zu fixxen, aber es nicht hinbekomme:



    new OpferName[MAX_PLAYER_NAME], OpferKopfgeld[20];
    GetPVarString(playerid, "OpferName", OpferName, sizeof(OpferName));
    GetPVarString(playerid, "OpferKopfgeld", OpferKopfgeld, sizeof(OpferKopfgeld));
    GivePlayerCash(playerid, strval(OpferKopfgeld));
    new str[145];
    format(str, sizeof(str), "{FF0000}Auftrag: Töte: %s !", OpferName);
    SpielerInfo[OpferName][pKopfgeld] = 1;
    SendeFraktion(6,WEIS, str);


    Wie mach ich das mit dem Opfername?
    GetPlayerName kann ich da ja nicht machen oder?


    MFG

  • D4rkZ3r0x


    Hier kann man den Auftrag annehmen!



    if(dialogid == DIALOG_HCOMPUTER)
    {
    if(response)
    {
    if(listitem == 0)
    {
    new
    [MAX_PLAYER_NAME], OpferKopfgeld[20];
    GetPVarString(playerid, "OpferName", OpferName, sizeof(OpferName));
    GetPVarString(playerid, "OpferKopfgeld", OpferKopfgeld, sizeof(OpferKopfgeld));
    GivePlayerCash(playerid, strval(OpferKopfgeld));
    new str[145];
    format(str, sizeof(str), "{FF0000}Auftrag: Töte: %s !", OpferName);
    SpielerInfo[OpferName][pKopfgeld] = 1;
    SendeFraktion(6,WEIS, str);
    }


    Und so erstellt man den Auftrag:

    if(dialogid == DIALOG_DARKNET)
    {
    if(response)
    {
    if(listitem == 0)
    {
    ShowPlayerDialog(playerid,DIALOG_ILLEGALEORTE,DIALOG_STYLE_LIST,"Illegale Orte","Bank-Rob\nSchwarzmarkt\nDrogenpakete\nWaffenpakete\nGangJail\nAuto-Crusher","Wählen","Abbrechen");
    }
    if(listitem == 1)
    {
    ShowPlayerDialog(playerid,DIALOG_HITMANAUFTRAG,DIALOG_STYLE_INPUT,"Hitman.onion","Bitte den Namen des Opfers eingeben:","Okay","Abbrechen");
    }
    }
    }
    if(dialogid == DIALOG_HITMANAUFTRAG)
    {
    if(response)
    {
    ShowPlayerDialog(playerid,DIALOG_HITMANAUFTRAG2,DIALOG_STYLE_INPUT,"Hitman.onion","Kopfgeld eingeben:","Okay","Abbrechen");
    SetPVarString(playerid, "OpferName", inputtext);
    }
    }
    if(dialogid == DIALOG_HITMANAUFTRAG2)
    {
    if(response)
    {
    ShowPlayerDialog(playerid,DIALOG_HITMANAUFTRAG3,DIALOG_STYLE_INPUT,"Hitman.onion","Fraktion des Opfers:","Okay","Abbrechen");
    SetPVarString(playerid, "OpferKopfgeld", inputtext);
    }
    }
    if(dialogid == DIALOG_HITMANAUFTRAG3)
    {
    if(response)
    {
    ShowPlayerDialog(playerid,DIALOG_HITMANAUFTRAG4,DIALOG_STYLE_INPUT,"Hitman.onion","Aufenthalt(e) des Opfers:","Okay","Abbrechen");
    SetPVarString(playerid, "OpferFraktion", inputtext);
    }
    }
    if(dialogid == DIALOG_HITMANAUFTRAG4)
    {
    if(response)
    {
    ShowPlayerDialog(playerid,DIALOG_HITMANAUFTRAG5,DIALOG_STYLE_INPUT,"Hitman.onion","Sonstige Informationen zum Opfer:","Okay","Abbrechen");
    SetPVarString(playerid, "OpferAufenthalt", inputtext);
    }
    }
    if(dialogid == DIALOG_HITMANAUFTRAG4)
    {
    if(response)
    {
    ShowPlayerDialog(playerid,DIALOG_HITMANAUFTRAG6,DIALOG_STYLE_MSGBOX,"Hitman.onion"," *- Auftrag abgeschickt, wir melden uns! -* ","Okay","Abbrechen");
    SetPVarString(playerid, "OpferInfos", inputtext);
    new OpferName[128];
    new OpferKopfgeld[128];
    new OpferFraktion[128];
    new OpferAufenthalt[128];
    new OpferInfos[128];
    GetPVarString(playerid, "OpferName", OpferName, sizeof(OpferName));
    GetPVarString(playerid, "OpferKopfgeld", OpferKopfgeld, sizeof(OpferKopfgeld));
    GetPVarString(playerid, "OpferFraktion", OpferFraktion, sizeof(OpferFraktion));
    GetPVarString(playerid, "OpferAufenthalt", OpferAufenthalt, sizeof(OpferAufenthalt));
    GetPVarString(playerid, "OpferInfos", OpferInfos, sizeof(OpferInfos));
    new str[145];
    format(str, sizeof(str), "{FF0000}Auftrag: Opfer: %s - Kopfgeld: %s - Fraktion: %s !", OpferName, OpferKopfgeld, OpferFraktion);
    SendeFraktion(6,WEIS, str);
    format(str, sizeof(str), "{FF0000}Auftrag: {FFFFFF}Aufenthaltsort(e): %s", OpferAufenthalt);
    SendeFraktion(6,WEIS, str);
    format(str, sizeof(str), "{FF0000}Auftrag: {FFFFFF}Sonstige Infos: %s", OpferInfos);
    SendeFraktion(6,WEIS, str);
    format(str, sizeof(str), "{FF0000}Auftrag: {FFFFFF}/hcomputer - Auftrag annehmen");
    SendeFraktion(6,WEIS, str);
    for(new i; i<MAX_CONTRACTS; i++) {
    if(!strlen(contractArray[i])) {
    format(contractArray[i], sizeof(contractArray[]), "Auftrag %i", i);
    break;
    }
    }
    }
    }


    MFG :)

  • Ich meinte, was genau der Fehler ist. Aber ich glaube du meinst, dass der OpferName nicht richtig angezeigt wird, schätze ich.
    Denn der wird nur in der Auftragssender-PVar gespeichert und du versuchst ihn in der Auftragsannehmer-PVar auszulesen.
    Also am besten global speichern, ich bevorzuge Enums.



    enum e_auftrag {
    bool:aktiv,
    name_sender[MAX_PLAYER_NAME],
    name_killer[MAX_PLAYER_NAME],
    name_angenommen[MAX_PLAYER_NAME],
    kopfgeld
    };
    new auftrag_data[MAX_AUFTRAG][e_auftrag];


    Wenn jemand einen Auftrag erstellt:

    for(new i; i<MAX_AUFTRAG; i++) {
    if(!auftrag_data[i][aktiv]) { // Prüfen, ob der i-te Auftrag noch nicht aktiv ist
    auftrag_data[i][aktiv] = true; // Ihn aktiv setzen
    auftrag_data[i][kopfgeld] = kopfgeld; // Kopfgeld setzen

    new tempStr[MAX_PLAYER_NAME];
    GetPlayerName(playerid, auftrag_data[i][name_sender], MAX_PLAYER_NAME);
    // Wenn man in das Input-Feld die ID eintippen soll:
    // Am besten irgendwo davor prüfen, ich mache es jetz hier um es nicht noch zu verkomplitzieren:
    if(strval(inputtext) == INVALID_PLAYER_ID) {
    auftrag_data[i][aktiv] = false;
    SendClientMessage(playerid, 0xFFFFFFFF, "FALSCHE ID");
    }
    GetPlayerName(strval(inputtext), auftrag_data[i][name_killer], MAX_PLAYER_NAME];
    return;
    }
    }
    // Wenn hier angekommen, sind alle Aufträge belegt}


    // Wenn jemand einen Auftrag annimmt:

    if(!strlen(auftrag_data[listitem][name_angenommen])) { // Kümmert sich bereits jemand um den Auftrag?
    GetPlayerName(playerid, auftrag_data[listitem][name_angenommen], MAX_PLAYER_NAME);


    // Beispiel einer Anzeige:
    new tempStr[64];
    format(tempStr, sizeof(tempStr), "Töte %s, du kriegst %d Kopfgeld!", auftrag_data[listitem][name_killer], auftrag_data[listitem][kopfgeld]);
    SendClientMessage(playerid, 0xFFFFFFFF, tempStr);
    }