Beiträge von Jeffry

    Ich sage es mal so, für die meisten geht es schneller und ist damit einfacher, wenn man sscanf und ocmd nutzt, anstatt mit strcmp und strtok die Befehle zu erstellen, das ist schwieriger.
    Von der Performance ist ocmd auf jeden Fall besser, als es mit strcmp zu machen. sscanf und strtok nehmen sich in den meisten Fällen nicht viel.

    sscanf hat mit MySQL nichts direkt zu tun. Das kannst du also machen, wie es dir am liebsten ist, wenn du lieber strtok nutzt, kannst du das natürlich machen. Ich mache die Beispiele meistens mit sscanf, da das die meisten hier nutzen.

    Zum einen Brauchst du einen Stock, der abfragt, welchem Haus du am nächsten bist:
    stock GetNearestHaus(playerid)
    {
    new id = -1, Float:dist, Float:tmp = 5.0;
    for(new i = 0; i < sizeof(Hauser); i++)
    {
    dist = GetPlayerDistanceFromPoint(playerid, Hauser[i][H_X], Hauser[i][H_Y], Hauser[i][H_Z]);
    if(dist < tmp)
    {
    tmp = dist;
    id = i;
    }
    }
    return id;
    }


    Dann kann der Befehl so aussehen:
    ocmd:hausbearbeiten(playerid, params[])
    {
    new item[16], value;
    if(sscanf(params, "s[16]d", item, value)) return SendClientMessage(playerid, 0xFF0000FF, "Nutze: /hausbearbeiten [Preis/Miete] [Wert]");
    new id = GetNearestHaus(playerid);
    if(id == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du bist nicht in der Nähe eines Hauses.");
    if(!strcmp(item, "Preis", true))
    {
    Hauser[id][hPreis] = value;
    //Nachricht etc...
    return 1;
    }
    else if(!strcmp(item, "Miete", true))
    {
    Hauser[id][hMiete] = value;
    //Nachricht etc...
    return 1;
    }
    //...
    return SendClientMessage(playerid, 0xFF0000FF, "Nutze: /hausbearbeiten [Preis/Miete] [Wert]");
    }

    An sich war das schonmal gut was du gemacht hast.
    Nur das mit der VehicleID hat dich anscheinend etwas verwirrt, das war nämlich das einzig wirkliche Problem, was sich durch den ganzen Code gezogen hat. Da wir das hier nicht brauchen, habe ich das einfach entfernt, und die Speicherung beim "Check" mit dem Index "i" gemacht.


    Teste es so, das sollte dann alles klappen:
    #include <a_samp>
    #include <Dini>
    #include <ocmd>
    #include <streamer>


    #define MaxGifts 10


    enum fracVehEnum
    {
    Float:e_x,
    Float:e_y,
    Float:e_z,
    Float:e_a,
    e_oID
    };
    new GiftBox[MaxGifts][fracVehEnum];



    public OnFilterScriptInit()
    {
    LoadGiftBoxs();
    return 1;
    }


    LoadGiftBoxs()
    {
    new CreatedGiftBoxes, path[64];
    //Schleife durch alle Dateien:
    for(new i=0; i<MaxGifts; i++)
    {
    //Es wird geprüft, ob ein Fahrzeug mit der ID existiert, wenn nicht, wird diese ID übersprungen
    format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
    if(!fexist(path)) continue;
    //Fahrzeug existiert im GiftBoxs-Ordner, wir laden die Daten jetzt aus der Datei.
    GiftBox[i][e_x] = floatstr(dini_Get(path, "x"));
    GiftBox[i][e_y] = floatstr(dini_Get(path, "y"));
    GiftBox[i][e_z] = floatstr(dini_Get(path, "z"));
    GiftBox[i][e_a] = floatstr(dini_Get(path, "a"));

    GiftBox[i][e_oID] = CreateDynamicObject(19054, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z], 0.0, 0.0, GiftBox[i][e_a]);


    CreatedGiftBoxes++;
    if(CreatedGiftBoxes == MaxGifts) return print("Es können keine weiteren Geschenke geladen werden, Limit (MaxGifts) erreicht.");
    }
    return 1;
    }


    stock SaveFracVehCheck(i)
    {
    //Deklaration neuer temporärer Variablen:
    new path[64];
    if(i > -1 && i < sizeof(GiftBox))
    {
    //Es wird der Pfad gesetzt:
    format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
    //Und wir speichern die Daten:
    dini_FloatSet(path, "x", GiftBox[i][e_x]);
    dini_FloatSet(path, "y", GiftBox[i][e_y]);
    dini_FloatSet(path, "z", GiftBox[i][e_z]);
    dini_FloatSet(path, "a", GiftBox[i][e_a]);
    return 1; //Es gibt ja keine zwei gleichen Fahrzeuge
    }
    return 0; //Fahrzeug ist kein Fraktions-Fahrzeug
    }


    forward SaveAllFracVehs();
    public SaveAllFracVehs()
    {
    //Deklaration neuer temporärer Variablen:
    new path[64];
    //Schleife durch alle Fraktions-Fahrzeuge:
    for(new i=0; i<MaxGifts; i++)
    {
    //Es wird der Pfad gesetzt:
    format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
    //Und wir speichern die Daten:
    dini_FloatSet(path, "x", GiftBox[i][e_x]);
    dini_FloatSet(path, "y", GiftBox[i][e_y]);
    dini_FloatSet(path, "z", GiftBox[i][e_z]);
    dini_FloatSet(path, "a", GiftBox[i][e_a]);
    }
    return 1;
    }


    ocmd:geschenk(playerid, params[])
    {
    for(new i=0; i<MaxGifts; i++)
    {
    if(GiftBox[i][e_x] == 0.0 && GiftBox[i][e_y] == 0.0 && GiftBox[i][e_z] == 0.0)
    {
    //Daten werden übergeben
    new Float:x, Float:y, Float:z, Float:a;
    GetPlayerPos(playerid, x, y, z);
    GetPlayerFacingAngle(playerid, a);
    GiftBox[i][e_x] = x;
    GiftBox[i][e_y] = y;
    GiftBox[i][e_z] = z - 0.4;
    GiftBox[i][e_a] = a;
    GiftBox[i][e_oID] = CreateDynamicObject(19054,x, y, z - 0.4, 0.0, 0.0,a);


    //Zuletzt wird die Datei angelegt und das Fahrzeug gespeichert.
    new path[64];
    format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
    dini_Create(path);
    SaveFracVehCheck(i);
    return SendClientMessage(playerid, 0x00FF00FF, "Geschenke gespeichert.");
    }
    }
    return SendClientMessage(playerid, 0xFF0000FF, "Error: Limit für Geschenke erreicht.");
    }



    //Stocks
    stock strtok2(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;
    }
    stock IsNumeric(string[])
    {
    for (new i = 0, j = strlen(string); i < j; i++)
    {
    if ((string[i] > '9' || string[i] < '0')) return 0;
    }
    return 1;
    }

    printf("[ERROR] Interior '%d' existiert nicht (ID: %d).",Hauser[id][IntID], ID);
    zu:
    printf("[ERROR] Interior '%d' existiert nicht (ID: %d).",Hauser[id][IntID], id);


    Das "ID" muss klein geschrieben werden, sonst nutzt du das Teil aus dem Enum, das geht nicht.

    Nimm die Befehle die nicht gehen, und füge sie direkt unter den Befehl ein, der geht (gleich eine Zeile drunter).
    Wenn sie dann noch immer nicht gehen, dann benenne sie mal um zu /abcdef oder sowas, einfach zum Testen, ob vielleicht alle Befehle mit "m" zu Beginn nicht gehen.

    Also ich habe es jetzt grade bei mir ausprobiert, da klappt es ohne Probleme.


    Siehe:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Versuche es so:
    cmd:aufbrechen(playerid,params[])
    {
    if(!IstSpielerInFrak(playerid,5)) return SendClientMessage(playerid,COLOR_RED,"Du bist nicht beim ADAC!");
    new Float:vX, Float:vY, Float:vZ, p_vid = GetPlayerVehicleID(playerid);
    for(new vid = 0; vid < MAX_VEHICLES; vid++)
    {
    if(vid == p_vid) continue;
    GetVehiclePos(vid,vX,vY,vZ);
    if(GetPlayerDistanceFromPoint(playerid, vX, vY, vZ) < 10.0)
    {
    PutPlayerInVehicle(playerid, vid, 0);
    return SendClientMessage(playerid, COLOR_GREEN, "Du hast das Fahrzeug aufgebrochen");
    }
    }
    return SendClientMessage(playerid, COLOR_RED, "Es befindet sich kein Fahrzeug in der Nähe!");
    }


    Habe die Distanz etwas erhöht und in der Schleife was verbessert. Wenn es geht, dann kannst du ja versuchen, die Distanz wieder anzupassen.