Missionssystem - Problem

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 bin gerade dabei ein dynamisches Missions-System zu erstellen und stecke fest. Und zwar habe ich mit einem Enum angefangen und erstmal
    die ID, den Namen und den Lohn im Enum definiert. Weiterhin bin ich direkt zum Befehl gegangen, der auch dadrunter zusehen ist, und habe
    ihn erstellt. Im Befehl INSERTE ich den mNamen(Missionsnamen) und den mLohn(Missionslohn) und sende die Query ab. Diese leitet zusätzlich
    zum Public OnMissionCreate weiter, damit eine ID erstellt werden kann. Das habe ich ein wenig von meinem Registrierungs-System entnommen.
    Ich habe aber ein Problem bzw. ich merke, dass ich einen gravierenden Fehler gemacht habe und blicke nicht durch. Ich glaube, dass der ganze Code
    falsch ist .




    enum mSystem
    {
    m_id,
    mName
    mLohn
    }
    new mSys[MAX_PLAYERS][mSystem];


    ocmd:createmission(playerid, params[])
    {
    new mname, mlohn;
    if(sscanf(params,"si",mname,mlohn)) return SendClientMessage(playerid, TURKISE, "[SYNTAX] /createmission <ID> <Lohn>");
    if(mname < 10 || mname > 60) return SendClientMessage(playerid, BLUE, "Der Missionsname darf nicht weniger als 10 und nicht meh als 60 Zeichen besitzen");
    if(mlohn < 500 || mlohn > 6000) return SendClientMessage(playerid, BLUE, "Das Missionsgehalt darf nicht weniger als 500 € und nicht mehr als 6000 € betragen.");
    new query[256];
    mysql_format(handle, query, sizeof(query), "INSERT INTO missionsystem (missionname, lohn) VALUES ('%s', '%i')", mname, mlohn);
    mysql_pquery(handle, query, "OnMissionCreate", "d", playerid);
    return 1;
    }



    forward OnMissionCreate(playerid);
    public OnMissionCreate(playerid)
    {
    mSys[playerid][m_id] = cache_insert_id();
    SendClientMessage(playerid, TURKISE, "Du hast eine neue Mission erstellt");
    return 1;
    }



    forward OnMissionLoad(playerid);
    public OnMissionLoad(playerid)
    {
    mSys[playerid][m_id] = cache_get_field_content_int(0, "mid", handle);
    mSys[playerid][mName] = cache_get_field_content_int(0, "mname", handle);
    mSys[playerid][mLohn] = cache_get_field_content_int(0, "mlohn", handle);
    return 1;
    }



    stock SaveCreatedMissions(playerid)
    {
    new query[250];
    mysql_format(handle, query, sizeof(query), "UPDATE missionsystem SET mname = '%s', mlohn = '%i', WHERE mid = '%d'", mSys[playerid][mName], mSys[playerid][mLohn], mSys[playerid][m_id]); mysql_pquery(handle, query);
    }


    Vielen Dank schon mal im Voraus.

    Einmal editiert, zuletzt von Kristik47 ()

  • stock SaveCreatedMissions(playerid){new query[250];mysql_format(handle, query, sizeof(query), "UPDATE missionsystem SET mname = '%s', mlohn = '%i', WHERE mid = '%d'", mSys[playerid][mName], mSys[playerid][mLohn], mSys[playerid][m_id]); mysql_pquery(handle, query);}
    Ich frage mich warum du hier playerid verwendest?
    Das ist doch nichts Spielerbezogenes..
    Und mit der Funktion speicherst du dann immer nur eine Mission ab, da du keine Schleife verwendest.
    Genauso wie du so nur eine Mission lädst.

  • stock SaveCreatedMissions(playerid){new query[250];mysql_format(handle, query, sizeof(query), "UPDATE missionsystem SET mname = '%s', mlohn = '%i', WHERE mid = '%d'", mSys[playerid][mName], mSys[playerid][mLohn], mSys[playerid][m_id]); mysql_pquery(handle, query);}
    Ich frage mich warum du hier playerid verwendest?
    Das ist doch nichts Spielerbezogenes..
    Und mit der Funktion speicherst du dann immer nur eine Mission ab, da du keine Schleife verwendest.
    Genauso wie du so nur eine Mission lädst.

    Okay, du hast mir schon einige logische Korrekturen geschrieben, die ich auch vornehmen werden. Danke dir.
    Da wo du gerade sagst, dass es nicht spielerbezogenes ist, habe ich es mal direkt verändert.

  • Okay, du hast mir schon einige logische Korrekturen geschrieben, die ich auch vornehmen werden. Danke dir.Da wo du gerade sagst, dass es nicht spielerbezogenes ist, habe ich es mal direkt verändert.

    Funktioniert es nun besser/ oder funktioniert aktuell überhaupt was?
    Zeig mal bitte wie du das ganze bei Ongamemodeinit lädst.

  • Ich habs mittlerweile anders gemacht und jetzt habe ich ein Problem. Es INSERT'et alles perfekt,
    aber wenn ich es löschen will, dann steht da "Ein solcher Eintrag existiert nicht."


    Hier ist der Befehl und wie ich es lade und speicher:



    ocmd:deletemission(playerid, params[])
    {
    new einlesen, mdelname[100], query[256], delquery[256];
    if(sscanf(params,"%s",mdelname)) return SendClientMessage(playerid, -1, "{FF3200}[SYNTAX:] {BEBEBE}/deletemission <Name der Mission");
    format(query,sizeof(query),"SELECT * FROM missionsystem WHERE missionname='%s'", mdelname);
    einlesen = mysql_pquery(handle, query);
    if(cache_num_rows(einlesen) == 1)
    {
    format(delquery,sizeof(delquery), "DELETE * FROM missionsystem WHERE missionname='%s'",mdelname);
    mysql_pquery(handle, delquery);
    }
    else
    {
    SendClientMessage(playerid, -1, "{FF3200}[FEHLER:] {BEBEBE}Ein solcher Eintrag existiert nicht.");
    }
    return 1;
    }


    stock OnMissionSave()
    {
    new query[500];
    for(new ix = 0; ix < cache_num_rows(); ix++)
    {
    mysql_format(handle, query, sizeof(query), "UPDATE missionsystem SET missionname = '%s', mlohn = '%i' WHERE id = '%d'", mSys[ix][m_name], mSys[ix][m_lohn], mSys[ix][m_id]);
    mysql_pquery(handle, query);
    }
    return 1;
    }


    stock OnMissionLoad()
    {
    new query[500];
    for(new ix = 0; ix < cache_num_rows(); ix++)
    {
    format(query,sizeof(query),"SELECT * FROM missionsystem");
    mysql_pquery(handle,query);
    new MissionName[256];
    mSys[ix][m_name] = cache_get_field_content(0, "missionname", MissionName);
    mSys[ix][m_lohn] = cache_get_field_content_int(0, "mlohn", handle);
    }
    return 1;
    }


    Und wo ich es lade und speicher:


    public OnGameModeInit()
    {
    mysql_log(LOG_ALL);
    SetGameModeText("LP-GTA_SAMP");
    MySQL_SetupConnection();
    OnMissionLoad();
    print("Missionen wurden geladen");
    return 1;
    }


    public OnGameModeExit()
    {
    OnMissionSave();
    print("Missionen wurden gesichert und deaktiviert.");
    mysql_close(handle);
    return 1;
    }



    @phN

  • Alles klar. Das mit dem %s habe ich wohl durch Konzetrationsmangel eingebaut.
    Ist aber wieder beseitigt. Ich habe es ausprobiert, doch es kommt das gleiche "Ein solcher Eintrag existiert nicht."
    Dabei habe ich die Groß- und Kleinschreibung beachtet. So wie immer. Keine Ahnung,
    ich glaube ich versuche es mal mit der mid (die ID des Datensatzes).


    @phN

  • Code
    ocmd:deletemission(playerid, params[])
    {
        new mdelname[100], query[256];
        if(sscanf(params,"s",mdelname)) return SendClientMessage(playerid, -1, "{FF3200}[SYNTAX:] {BEBEBE}/deletemission <Name der Mission");
        mysql_format(handle,query,sizeof(query),"SELECT * FROM missionsystem WHERE missionname='%s'", mdelname);
        mysql_pquery(handle, query, "DeleteMission", "ds", playerid,mdelname);
    }


    Hoffe, dass das richtig ist.
    Bitte verbessern, wenn nicht.^^

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Dankesehr. Habe es ein wenig verändert, aber immerhin wird jetzt nicht angezeigt, dass er keine Datensätze findet.
    Ich habe den Debugger mal angeschmissen und das entsteht, wenn er die Query versucht auszuführen:




    Das ist die Line die gemeint wird:



    Code
    mysql_format(handle,delquery,sizeof(delquery), "DELETE * FROM missionsystem WHERE missionname='%s'",mdelname);


    So sieht der Code bei mir jetzt aus:



  • Code
    mysql_format(handle,delquery,sizeof(delquery), "DELETE * FROM missionsystem WHERE missionname='%s'",mdelname);

    zu:


    Code
    mysql_format(handle,delquery,sizeof(delquery), "DELETE FROM missionsystem WHERE missionname='%s'",mdelname);
  • Code
    mysql_format(handle,delquery,sizeof(delquery), "DELETE * FROM missionsystem WHERE missionname='%s'",mdelname);

    zu:


    Code
    mysql_format(handle,delquery,sizeof(delquery), "DELETE FROM missionsystem WHERE missionname='%s'",mdelname);

    Vielen vielen Dank dafür. Es funktioniert tatsächlich.

  • Habs grad bei mir getestet.


    Beim Deletemission Command:


    Code
    mysql_pquery(handle, query, "DeleteMission", "us", playerid,mdelname);


    zu:

    Code
    mysql_pquery(handle, query, "DeleteMission", "ds", playerid,mdelname);


    Und beim Public:

    zu:




    Sonst wird das hier:


    Code
    SendClientMessage(playerid, -1, "{FF3200}[FEHLER:] {BEBEBE}Ein solcher Eintrag existiert nicht.");


    nie aufgerufen.^^