Beiträge von Jeffry

    Jeffry, schon einmal dran gedacht skripten zu lehren? Damn...

    Mach ich doch hier seit Jahren schon :klugs:



    Wie lese ich die Zeile aus, wenn er z.B. 3 Autos hat und er das 2te verkaufen möchte?

    if(dialogid == DIALOG_SELLKEYS)
    {
    if(!response) return 1;
    new count = -1;
    for(loop=0;loop<sizeof(cInfo);loop++)
    {
    if(!cInfo[loop][id_x])continue;
    if(cInfo[loop][besitzer]!=pInfo[playerid][ID])continue;
    count++;
    if(count == listitem)
    {
    printf("Ausgewähltes Fahrzeug: %s", GetVehicleName(cInfo[loop][model]));
    return 1;
    }
    }
    return 1;
    }

    if(dialogid == DIALOG_CARKEY)
    {
    if(!response) return 1;
    new count = -1;
    for(new s = 0; s <= 4; s++)
    {
    for(new i = 0; i < sizeof(cInfo); i++)
    {
    if(cInfo[i][besitzer] == PlayerInfo[playerid][pMySQLID] && cInfo[i][slot] == s)
    {
    count++;
    if(count == listitem)
    {
    carKey[playerid] = cInfo[i][id_x];
    carKeyIdx[playerid] = i;
    SendClientMessage(playerid, 0xFFFF00FF, "Schlüssel ausgewählt.");
    return 1;
    }
    }
    }
    }
    return SendClientMessage(playerid, 0xFF0000FF, "Error: Kein Schlüssel im Slot.");
    }


    "carKey[playerid]" beinhaltet dann die vehicleid und "carKeyIdx[playerid]" den Index (i).


    Der Befehl:
    ocmd:carlock(playerid,params[])
    {
    new engine,lights,alarm,doors,bonnet,boot,objective;
    new vid = carKey[playerid];
    if(!IsANoMotorVehicle(vid))
    {
    if(locksvar[vid] == 0)
    {
    GetVehicleParamsEx(vid,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(vid,engine,lights,alarm,VEHICLE_PARAMS_ON,bonnet,boot,objective);
    GameTextForPlayer(playerid,"~r~Abgeschlossen",6000,5);
    locksvar[vid] = 1;
    }
    else
    {
    GetVehicleParamsEx(vid,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(vid,engine,lights,alarm,VEHICLE_PARAMS_OFF,bonnet,boot,objective);
    GameTextForPlayer(playerid,"~g~Aufgeschlossen",6000,5);
    locksvar[vid] = 0;
    }
    }
    return 1;
    }

    Wenn du die Schleife einmal ausführst, dann behält "loop" den Wert "sizeof(cInfo)", sprich es wird nie mehr kleiner als "sizeof(cInfo)" sein.
    Du musst die Variable entweder lokal im Schleifenkopf deklarieren, oder in im Schleifenkopf auf 0 setzen.

    Da seine Slots bei 0 anfangen, muss der Befehl so aussehen:
    ocmd:carkey(playerid,params[])
    {
    new string[512], bool:found, model;
    for(new s = 0; s <= 4; s++)
    {
    found = false;
    for(new i = 0; i < sizeof(cInfo); i++)
    {
    if(cInfo[i][besitzer] == PlayerInfo[playerid][pMySQLID] && cInfo[i][slot] == s)
    {
    found = true;
    model = cInfo[i][carmodel];
    if(model >= 400 && model <= 611) format(string,sizeof(string),"%s{FF0000}%d) %s\n",string, s, getVehicleName(model));
    else format(string,sizeof(string),"%s{00FF00}%d) -Schlüssel frei-\n",string, s);
    break;
    }
    }
    if(!found) format(string,sizeof(string),"%s{00FF00}%d) -Schlüssel frei-\n",string, s);
    }
    ShowPlayerDialog(playerid,DIALOG_CARKEY,DIALOG_STYLE_LIST,"Fahrzeuge",string,"Auswählen","Beenden");
    return 1;
    }


    Eventuell im format "s+1" machen, damit der User die Slots von 1 bis 5 angezeigt bekommt.

    Das dies ein Localhost Server ist und du nicht mit deiner IP auf dem Server bist, ist das Normal

    Nein, das stimmt nicht.

    Oh, das wusste ich aber auch noch nicht. Ich dachte bei localhost steht immer 127.0.0.1.

    Genau, das ist so.

    auch mal wieder was dazu gelernt

    Bitte schnell wieder vergessen!




    Der Grund warum in der IP 255.255.255.255 steht ist folgender:

    https://wiki.sa-mp.com/wiki/GetPlayerIp


    Du rufst dein SavePlayer unter OnPlayerDisconnect auf, daher stimmt die IP nicht mehr.


    Speichere die IP in eine Spielervariable in OnPlayerConnect und nutze diese dann.
    new pIP[MAX_PLAYERS][16];
    GetPlayerIp(playerid, pIP[playerid], 16);


    Überall dann einfach
    pIP[playerid]
    für das Auslesen der IP nutzen.

    Hat da jemand ne bessere Version?


    Die Funktion ist eigentlich korrekt so, da mit der Länge und der Breite des jeweiligen Fahrzeugs individuell gearbeitet wird.


    Du kannst höchstens mal versuchen in IsPlayerInRangeOfPoint dem radius minus 0.1 zu nehmen oder so, dann passt es vielleicht besser zur Seite hin.

    Was wird dir so im Server Log ausgegeben?
    ocmd:carkey(playerid,params[])
    {
    new string[512], bool:found, model;
    for(new s = 0; s <= 4; s++)
    {
    found = false;
    printf("Starte Slot %d", s);
    for(new i = 0; i < sizeof(cInfo); i++)
    {
    printf("i: %d -> Besitzer: %d == %d / Slot: %d", i, cInfo[i][besitzer], PlayerInfo[playerid][pMySQLID], cInfo[i][slot]);
    if(cInfo[i][besitzer] == PlayerInfo[playerid][pMySQLID] && cInfo[i][slot] == s)
    {
    found = true;
    model = cInfo[i][carmodel];
    printf("model: %d", model);
    if(model >= 400 && model <= 611) format(string,sizeof(string),"%s{FF0000}%d) %s\n",string, s, getVehicleName(model));
    else format(string,sizeof(string),"%s{00FF00}%d) -Schlüssel frei-\n",string, s);
    break;
    }
    }
    printf("found = false");
    if(!found) format(string,sizeof(string),"%s{00FF00}%d) -Schlüssel frei-\n",string, s);
    }
    ShowPlayerDialog(playerid,DIALOG_CARKEY,DIALOG_STYLE_LIST,"Fahrzeuge",string,"Auswählen","Beenden");
    return 1;
    }

    Geht das nicht mit der älteren sscanf version?

    Scheint nicht so.


    Nutze die Variante mit dem Split, das ist ohnehin besser, da man nicht für jede Kleinigkeit ein Plugin bzw. eine komplexe Include nutzen sollte.
    Sscanf alleine für den Split der IP zu nutzen wäre wie mit einem Panzer auf eine Bananenfliege zu schießen.