Beiträge von Jeffry

    Das geht nur mit dem Plugin.
    Wenn du das Plugin nicht haben willst (da kann ich dich voll und ganz verstehen, ich will es auch nicht haben), dann nutze strtok. Ist zwar etwas mehr Code, aber dafür viel flexibler:


    ocmd:gw(playerid,params[])
    {
    if(pInfo[playerid][Rang] <1) return SCM(playerid,ROT,"Du bist leider kein Admin!");
    new string[144],pID,wID, Munni, tmp[20], tmp2[20], tmp3[20], idx;
    tmp = strtok(params, idx);
    tmp2 = strtok(params, idx);
    if(!strlen(tmp2) || !IsNumeric(tmp2)) return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>");
    if(IsNumeric(tmp)) pID = strval(tmp);
    else pID = ReturnPlayerID(tmp);
    if(!IsPlayerConnected(pID))return SCM(playerid,ROT,"Der angegebene Spieler ist nicht connected!");
    wID = strval(tmp2);
    if(wID<0 || wID>46 || wID>18 && wID<22) return SCM(playerid,ROT,"Diese WaffenID ist ungültig!");
    tmp3 = strtok(params, idx);
    if(!strlen(tmp3))//hat er keine Munition angegeben, dann ....
    {
    GivePlayerWeapon(pID,wID,99999);
    format(string,sizeof(string),"Du hast %s eine Waffe mit unendlich Munition gegeben.",Spielername(pID));
    SCM(playerid,GREEN,string);
    format(string,sizeof(string),"Du hast von %s eine Waffe mit unendlich Munition bekommen.",Spielername(playerid));
    SCM(pID,GREEN,string);
    }
    else //Er hat Munition angegeben
    {
    Munni = strval(tmp3);
    GivePlayerWeapon(pID,wID,Munni);
    format(string,sizeof(string),"Du hast %s eine Waffe mit %d Schuss gegeben.",Spielername(pID),Munni);
    SCM(playerid,GREEN,string);
    format(string,sizeof(string),"Du hast von %s eine Waffe mit %d Schuss bekommen.",Spielername(playerid),Munni);
    SCM(pID,GREEN,string);
    }
    return 1;
    }



    Einmalig unten im Gamemode einfügen:

    Spoiler anzeigen
    stock strtok(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;
    }

    Spoiler anzeigen
    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }

    Spoiler anzeigen
    stock IsNumeric(string[])
    {
    for (new i = 0, j = strlen(string); i < j; i++)
    {
    if ((string[i] > '9' || string[i] < '0')) return 0;
    }
    return 1;
    }

    Ah, so meinst du das. Sorry, ich dachte du willst das mit dem unendlich weg haben.


    Hat noch jemand eine Idee wie man es umsetzen kann?


    Der Code von thetvMt2 passt nicht ganz, aber vom Prinzip her stimmt es dann.
    (Die IsPlayerConnected Abfrage war an der falschen Stelle.)


    ocmd:gw(playerid,params[])
    {
    if(pInfo[playerid][Rang] <1)return SCM(playerid,ROT,"Du bist leider kein Admin!");
    new pID,wID,Munni,string[144];
    if(sscanf(params,"uiI(-1)",pID,wID,Munni)return SCM(playerid,GELB,"INFO: /gw [PlayerID] [WaffenID] <Munition>");
    if(!IsPlayerConnected(pID))return SCM(playerid,ROT,"Der angegebene Spieler ist nicht connected!");
    if(wID<0 || wID>46 || wID>18 && wID<22)return SCM(playerid,ROT,"Diese WaffenID ist ungültig!");
    if(Munni==-1)//hat er keine Munition angegeben, dann ....
    {
    GivePlayerWeapon(pID,wID,99999);
    format(string,sizeof(string),"Du hast %s eine Waffe mit unendlich Munition gegeben.",Spielername(pID));
    SCM(playerid,GREEN,string);
    format(string,sizeof(string),"Du hast von %s eine Waffe mit unendlich Munition bekommen.",Spielername(playerid));
    SCM(pID,GREEN,string);
    }
    else //Er hat Munition angegeben
    {
    GivePlayerWeapon(pID,wID,Munni);
    format(string,sizeof(string),"Du hast %s eine Waffe mit %d Schuss gegeben.",Spielername(pID),Munni);
    SCM(playerid,GREEN,string);
    format(string,sizeof(string),"Du hast von %s eine Waffe mit %d Schuss bekommen.",Spielername(playerid),Munni);
    SCM(pID,GREEN,string);
    }
    return 1;
    }

    Dabei habe ich auch einen Fehler, da die 7 eigentlich der Infernus ist bei mir.


    So, ändere:


    new veh=GetPVarInt(playerid,"ImportVeh"),lk=GetPVarInt(playerid,"Lieferkosten");
    zu:
    new veh=gItemList[GetPVarInt(playerid,"ImportVeh")],lk=GetPVarInt(playerid,"Lieferkosten");


    Der 7. Index in gItemList ist der Infernus.


    Somit sollte die Schleife schonmal durchlaufen und die Nachricht mit dem Trucker kommen.



    Weiter konnte ich den Code nicht verfolgen, da die "ImportVehicle" Funktion nicht dabei ist.

    Was hast du denn da gemacht?! 8|


    Das geht viel einfacher.
    Ich versuche es nochmal zu erklären:


    OnGameModeInit:
    AddItemToDialog(dialogid_von_DE, "[0] DM1 [Sniper, Desert Eagle, Shotgun]");
    AddItemToDialog(dialogid_von_DE, "[0] DM2 [Desert Eagle, Combat Shotgun]");
    //usw...
    //Auch für das Englische machen.



    Dann dort, wo der Spieler dem DM beitritt:
    format(tmpstr, 128, GetItemFromDialog(dialogid, DM_ID_HIER));
    //dann das neue Item formatieren, also mit switch-case über die DM_ID neu setzen
    switch(DM_ID_VARIABLE)
    {
    case 0: format(newstr, 128, "[%d] DM2 [Desert Eagle, Combat Shotgun]", Spieler_In_dem_DM_0);
    //usw...
    }
    //Dann updaten:
    UpdateItemInDialog(dialogid_von_DE, tmpstr, newstr); //Die Funktion steht In Post #17


    //Dann das gleiche nochmal für Englisch machen.



    Dein Befehl sieht dann so aus:
    COMMAND:dm(playerid, params[])
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE) ShowPlayerDialog_Ex(playerid, dialogid_von_DE, DIALOG_STYLE_LIST, "DMs", GetDialogInfo(dialogid_von_DE), "Schließen", "Beitreten")
    if(pInfo[playerid][Language] == LANGUAGE_EN) ShowPlayerDialog_Ex(playerid, dialogid_von_EN, DIALOG_STYLE_LIST, "DMs", GetDialogInfo(dialogid_von_EN), "Close", "Join")
    return 1;
    }
    Mehr ist es nicht.


    Die Funktionen von mir musst du nicht ändern. Wenn du die änderst funktioniert es nicht mehr.


    Das Prinzip ist, dass ein Dialog erstellt wird (wie ein Auto).

    Mache ich eigentlich nicht, aber schicke mal (In PN!) deine TeamViewer Daten, dann schaue ich es mir kurz an.
    20 Minuten habe ich.


    EDIT:
    Ist erledigt. Da das StrickenKid Plugin nicht mit einem leeren Passwort klar kommt (warum auch immer), haben wir das Passwort beider (!) root Benutzer geändert, das Passwort für phpMyAdmin in der /xampp/phpMyAdmin/config.inc.php geändert und dann die Verbindung mit Passwort aufgebaut. Funktioniert jetzt.

    Ich denke du hast meinen Edit nicht mehr gesehen.
    Es ist wohl ein Fehler von dem Plugin.


    Nutze das R5 von BlueG stattdessen. Das ist eigentlich identisch, bis auf die Verbindungs-Funktion (hier: mysql_connect).
    http://forum.sa-mp.com/showthread.php?t=56564


    Download:
    MySQL Plugins R5
    [MySQL] R5 von G-sTyLeZzZ (Linux)
    Brauche Mysql R5 oder R6


    Ich hoffe einer der Links funktioniert noch.


    Dann nutze das Plugin und teste ob es geht. Sollte es eigentlich.



    ODER:
    Versuche das Passwort vom "root" Benutzer zu ändern und dann mit einem Passwort im Code zu connecten.

    Zitat

    [Thu Oct 09 17:29:17 2014] Error (0): Failed to connect. Access denied for user 'root' localhost (using password: YES).


    1.) Du nutzt localhost, nicht 127.0.0.1
    2.) Du nutzt ein Passwort. Hast du es selbst in deiner Datenbank geändert oder hast du den root Benutzer nicht angefasst?


    => Kann es sein, dass du im falschen Code werkelst, oder den falschen Server startest?



    Vergiss das. Anscheinend ist das ein Fehler des Plugins.
    Benutzt du das Plugin von StrickenKid?

    Nimm den "root" Benutzer ohne Passwort.


    #define MYSQL_HOST "localhost"
    #define MYSQL_USER "root"
    #define MYSQL_PASS ""
    #define MYSQL_DATA "DATENBANKNAME"


    Das ist in 99% aller Fälle standardmäßig so eingestellt.
    Dein user "samp" wird nicht die richtigen Berechtigungen haben, das ist auf localhost (dein Rechner) so eingestellt, standardmäßig zumindest.
    Deshalb benutze, wie ich oben geschrieben habe, den root - User ohne Passwort, der hat ALLE Berechtigungen. Dem kannst du später auch, je nach Client, ein Passwort geben.

    Ich fürchte es könnte wirklich ein Bug im Plugin sein.
    Wer entwickelt das denn? Wem könnte ich diesen Fehler mitteilen?


    Das könnte durchaus sein.


    Am besten da fragst du maddin, der kann dir das genau sagen, ob Bug oder nicht.

    Deswegen:
    DealerVehPrice[veh-400]


    veh ist 7, somit hast du einen negativen Index. Gibst du das die vehicle id mit anstatt der model id?


    Wenn ja, ändere das, oder mache:
    DealerVehPrice[GetVehicleModel(veh)-400]


    Nicht vergessen, das auch beim Print zu machen.



    Edit:
    DJ Deagle: Ok, dann schaue ich es mir morgen Abend wieder an, dann geht's weiter mit debuggen. Gute Nacht!

    Uhhh, da kommst du aber mit Sachen an, mein lieber Scholli!
    Das kann ich dir nicht aus dem FF sagen.


    Zwei Dinge die du testen kannst:
    Erstens, setze mal einen Timer, der erst nach einer Sekunde dieses Query mit der CALL Funktion aufruft, dann dürfte es nicht mehr direkt am Anfang stehen. Vielleicht hilft das schon etwas.


    Zweitens, führe das CALL Query in der SQL Eingabe von phpMyAdmin aus, funktioniert es da? Wenn ja, dann liegt es wohl am Plugin, das müsste man dann mal speziell testen.

    Das:
    new Spieler[64];
    new Sname[MAX_PLAYER_NAME];
    GetPlayerName(playerid,Sname,sizeof(Sname));
    format(Spieler,sizeof(Spieler),"/Accounts/%s.txt",Sname);
    if(dini_Exists(Spieler))
    {
    sSpieler[playerid][Skin] = dini_Int(Spieler,"Skin");
    }
    else sSpieler[playerid][Skin] = -1;


    bei OnPlayerConnect hinschreiben.


    Den Rest so machen wie ich es in Post #8 beschrieben habe.

    Ah, sehr gut!
    Normalerweise erstellt das Plugin dann eine neue ConnectionHandle, was bedeutet es funktioniert auch aus einem Filterscript ohne speziell die Verbindung darin aufzubauen.
    Die ConnectionHandle kannst du über CallRemoteFunction bekommen, wenn du es aber nur einmal verbindest ist die eigentlich immer die 1.
    Um sicher zu gehen, kannst du diese aber auch so abfragen:


    Im Gamemode:
    forward ReturnConnectionHandle();
    public ReturnConnectionHandle()
    {
    return cH;
    }



    Im Filterscript:
    mysql_function_query(GetConnectionHandle(),"SELECT Name,AdminLevel FROM Accounts WHERE AdminLevel>0","mysql_Admins","");


    stock GetConnectionHandle()
    {
    return CallRemoteFunction("ReturnConnectionHandle", "");
    }

    Bei jedem Fahrzeug?
    Ja, eigentlich schon. Bis auf die Boote, Flugzeuge, Motorräder, etc.
    Möglicherweise klappt es bei extrem großen Fahrzeugen nicht (Panzer?), da müsstest du dann das Modell abfragen (GetVehicleModel) und die Offsets ändern.


    Teste es einfach mal, ob es dem entspricht was du dir vorstellst.