Beiträge von Jeffry

    Du kannst ja mit "Index" nur eine Variable mitgeben (also die playerid). Du willst aber auch noch die pID dabei haben.
    Dann musst du die pID über eine Variable die mit playerid verbunden ist (in dem Fall die pVar) mitführen um sie da wieder aufrufen zu können.


    Man könnte es auch über ein globales Array machen, aber so erscheint es mir anschaulicher für dich.



    Du kannst es dir wie ein Koffer vorstellen. "playerid" nimmt einen Koffer mit sich der pVar-pID heißt, in dem der Wert von pID aus dem Befehl eingetragen wird.
    Prinzip verstanden? :)

    Schau dir deinen /ban Befehl an. Steht da irgendwas mit INSERT INTO? Nein => Es wird nichts in die Datenbank eingetragen, sprich du wirst auch nicht gebannt.
    Das solltest du hinzufügen.

    Du kannst der Funktion nicht einfach einen Parameter hinkleben, das geht nicht.


    public WBB_GotUserValidState ( Index , State) //Zeile2594
    {
    new string[256];
    if(State)
    {
    format(string,sizeof(string),"Der Spieler %s (ID: %i ) besitzt einen Forumaccount mit identischem Namen!",getPlayerName(GetPVarInt(Index, "pID")),GetPVarInt(Index, "pID")); //Zeile 2599
    SendClientMessage(Index, 0xFFFFFF, string);
    }
    else
    {
    format(string,sizeof(string),"Der Spieler %s (ID: %i ) besitzt keinen Forumaccount mit identischem Namen! Daher sollte er sich schnellstmöglich einen erstellen!",getPlayerName(GetPVarInt(Index, "pID")),GetPVarInt(Index, "pID")); //Zeile 2604
    SendClientMessage(Index, 0xFFFFFF, string);
    }
    return 1;
    }



    ocmd:forumacccheck(playerid,params[])
    {
    if(!isAdmin(playerid,2)) return SendClientMessage(playerid,-1,"Bitte frage einen Admin ob du einen Forumaccount hast");
    {
    new pID,Name[MAX_PLAYER_NAME];
    if(sscanf(params, "u", pID)) return SendClientMessage(playerid,-1,"INFO: /forumacccheck [ID | Username]");
    GetPlayerName(pID, Name, MAX_PLAYER_NAME);
    WBB_IsValidUser(Name, pID);
    SetPVarInt(playerid, "pID",pID)
    return 1;
    }
    }


    Wenn ich das mit dem Index richtig verstanden habe.

    Grund:
    new pID, grund[32],dauer,string[128];
    zu:
    new pID, grund[32],dauer,string[145];



    Zeit:
    SpielerTimeBan[pID][pTBanDauer] = Now() + dauer*60;
    zu:
    SpielerTimeBan[pID][pTBanDauer] = gettime() + dauer*60;



    Bei deinem Ban Befehl fehlt das Query, es kann nichts eingetragen werden.


    Wenn der Timeban noch immer nicht geht nach diesen beiden Änderungen, poste die CreateTBanAccount Funktion.

    Aaah und ich sags vorhin noch :wacko:
    mysql_function_query(dbhandle,query,true,"CreateHaus","i",id);
    zu:
    mysql_function_query(dbhandle,query,true,"CreateHouse","i",id);


    Dann dürfte es klappen.


    Das solltest du dringends vereinheitlichen. Entweder englisch oder deutsch.

    Hmm. Nimm folgenden Code:
    ocmd:createhouse(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Du bist nicht Eingeloggt!");
    if(pInfo[playerid][pAdmin] <6)return SendClientMessage(playerid,COLOR_GRAU,"Du bist nicht befugt diesen Befehl zu nutzen!");
    new klevel,kpreis;
    if(sscanf(params,"ii",klevel,kpreis))return SCM(playerid,COLOR_GRAU,"INFO: /createhouse [kauflevel] [kaufpreis]");
    new Float:x,Float:y,Float:z;
    GetPlayerPos(playerid,x,y,z);

    new query[250];
    new id = GetFreeHouseID();
    hInfo[id][hx] = x;
    hInfo[id][hy] = y;
    hInfo[id][hz] = z;
    hInfo[id][i_x] = 0.0;
    hInfo[id][i_y] = 0.0;
    hInfo[id][i_z] = 0.0;
    hInfo[id][h_interior] = 0;
    hInfo[id][h_level] = klevel;
    hInfo[id][h_preis] = kpreis;
    strmid(hInfo[id][h_besitzer], "",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    format(query,250,"INSERT INTO haus (hx,hy,hz,ix,iy,iz,h_interior,kauflevel,kaufpreis) VALUES ('%f','%f','%f','0.0','0.0','0.0','0','%i','%i')",
    x,y,z,klevel,kpreis);
    printf("create: id: %d", id);
    mysql_function_query(dbhandle,query,true,"CreateHaus","i",id);
    UpdateHaus(id);
    printf("%s",query);
    return 1;
    }


    public CreateHouse(id)
    {
    hInfo[id][db_id]=cache_insert_id();
    printf("function: %d -> %d", id,hInfo[id][db_id]);
    return 1;
    }


    Dann erstelle 2 Häuser ein paar Meter voneinander entfernt. Dann versuche das zweite Haus zu kaufen. Dann poste den Log von beiden prints.

    Ok, sehr gut.
    War das jetzt das allererste Haus welches du erstellt hast, also war zuvor noch keins in der Datenbank? Wenn ja, poste bitte die GetFreeHouseID Funktion.
    Wenn nein, welches dann? Poste dann ebenfalls die GetFreeHouseID Funktion.

    Du hast es an die falsche Stelle gesetzt:
    ocmd:buyhouse(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    if(HasPlayerHaus(playerid))return SendClientMessage(playerid,COLOR_GRAU,"Du hast bereits ein Haus.");
    for(new i=0; i<sizeof(hInfo); i++)
    {
    printf("i: %d / dbid: %d / besitzer: %s / near: %d", i, hInfo[i][db_id], hInfo[i][h_besitzer], IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]));
    if(!hInfo[i][db_id])continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(!strlen(hInfo[i][h_besitzer]))
    {
    if(GetPlayerMoney(playerid) < hInfo[i][h_preis])return SCM(playerid,COLOR_GRAU,"Du hast nicht genügend Geld für das Haus!");
    if(GetPlayerScore(playerid) < hInfo[i][h_level])return SCM(playerid,COLOR_GRAU,"Du hast nicht das nötige Level für das Haus!");
    GivePlayerMoney(playerid,-hInfo[i][h_preis]);
    strmid(hInfo[i][h_besitzer], SpielerName(playerid),0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    format(string,128,"** Du hast das Haus erfolgreich für %d$ gekauft. **",hInfo[i][h_preis]);
    SCM(playerid,COLOR_GELB,string);
    UpdateHaus(i);
    SaveHaus(i);
    return 1;
    }
    return SCM(playerid,COLOR_GRAU,"Dieses Haus ist bereits verkauft.");
    }
    return 1;
    }


    Hab auch gleich noch etwas dazugefügt, kann vielleicht nützlich sein.

    Bekommst du eine Nachricht, wenn du das Haus kaufen willst, es aber nicht geht?
    Wenn nein, dann füge mal das hier in den Befehl nach
    for(new i=0; i<sizeof(hInfo); i++)
    {

    ein:
    printf("dbid: %d / besitzer: %s", hInfo[i][db_id], hInfo[i][h_besitzer];


    Was wird dann geprintet?

    stock LoadTBanAccount(playerid)
    {
    new query[256],spieler[MAX_PLAYERS];
    GetPlayerName(playerid, spieler, MAX_PLAYER_NAME);
    format(query, sizeof(query), "SELECT banID FROM bans WHERE banName = '%s' AND banTime < %d", spieler, gettime());
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows())
    {
    format(query, sizeof(query), "DELETE FROM spielertimebanned WHERE banID = %d", mysql_fetch_int());
    mysql_query(query);
    }
    else
    {
    mysql_free_result();
    format(query, sizeof(query), "SELECT Dauer FROM spielertimebanned WHERE Name = '%s' AND Dauer >= %d",spieler, gettime());
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows())
    {
    new dauer = mysql_fetch_int() - gettime(); //dauer = Zeit in Sekunden
    new minuten = dauer / 60;
    new str[145];
    format(str, sizeof(str), "Du bist noch %d Minuten gebannt.", minuten);
    SendClientMessage(playerid, 0xFF0000FF, str);
    Kick(playerid);
    }
    }
    mysql_free_result();
    return true;
    }


    Allerdings musst du bei den 3 Queries noch die Spalten und Tabellennamen teilweise anpassen, das hast du noch nicht für alle gemacht.

    Haus wieder kaufen Problem:
    new tmp_name[MAX_PLAYER_NAME];
    strmid(hInfo[id][h_besitzer],tmp_name,0,sizeof(tmp_name),sizeof(tmp_name));
    cache_get_field_content(i,"h_besitzer",tmp_name,dbhandle);

    zu:
    new tmp_name[MAX_PLAYER_NAME];
    cache_get_field_content(i,"h_besitzer",tmp_name,dbhandle);
    strmid(hInfo[id][h_besitzer],tmp_name,0,sizeof(tmp_name),sizeof(tmp_name));

    in LoadHaus.


    Zwecks des anderen Problems:
    Poste bitte die CreateHaus Funktion.


    PS: Als kleine Anmerkung: Einen Code in Denglisch zu schreiben ist nicht gerade toll, da kommt man sehr oft durcheinander. Besser wäre "LoadHouse" oder "LadeHaus", ebenso für die anderen Funktionen. ;)

    Nemesus Jr.:
    Das wird so nicht funktionieren. Du machst einmal *-1 und einmal +-1.
    Außerdem brauchst du die beiden Hilfsvariablen nicht unbedingt:


    stock ZahlNaeherNull(zahl1, zahl2)
    {
        if(zahl1 < 0) zahl1 *= -1;
        if(zahl2 < 0) zahl2 *= -1;
        if(zahl1 < zahl2) return 1;
        else if(zahl1 == zahl2) return 0;
        else return 2;
    }


    So wäre es korrekt. ;)

    Nimm den "root" Benutzer ohne Passwort.
    #define SQL_HOST "localhost"
    #define SQL_USER "root"
    #define SQL_PASS ""
    #define SQL_DATA "samp"


    new MySQL:connection;


    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.



    Sollte auch das nicht klappen, sag uns bitte welches MySQL Plugin + Version du verwendest und poste nochmal den aktuellen Log.

    ocmd:veh(playerid, params[])
    {
    if(!isAdmin(playerid,2))return SendClientMessage(playerid, ROT, "Dein Adminlevel reicht nicht aus.");
    new mID, Float:x, Float:y, Float:z, Float:a;
    if(sscanf(params, "i", mID))return SendClientMessage(playerid, GRAU, ""cmderror"/veh <Vehicle ID>");
    if(mID<400||mID>611)return SendClientMessage(playerid, ROT, ""cmderror"die Fahrzeugid muss zwischen 400 und 611 liegen");
    GetPlayerPos(playerid, x, y, z);
    GetPlayerFacingAngle(playerid, a);
    new vID = CreateVehicle(mID, x+5, y, z, a, 0, 1, -1);
    printf("vID = %d", vID);
    PutPlayerInVehicle(playerid,vID,0);
    new string[256];
    format(string, sizeof(string), "[VEH] %s => %i X:%f Y:%f Z:%f", getPlayerName(playerid), mID, x, y, z);
    log("admin", string);
    format(string,sizeof(string),"%s hat sich ein Fahrzeug(%i) erstellt.",getPlayerName(playerid),mID);
    SendAdminChat(string);
    return 1;
    }


    public AC_CreateVehicle_Ex(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay){
    new vehicleid = CreateVehicle(modelid,Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay);
    AC_vspawn[vehicleid] = 1;
    printf("vehicleid = %d", vehicleid);
    return vehicleid;
    }


    Was wird geprintet, wenn du es so einfügst und dir dann mit /veh ein Fahrzeug erstellst?

    Hier hast du nochmal ein Beispiel, bzw. es ist schon fast ein kompletter Code:
    new query[256];
    format(query, sizeof(query), "SELECT banID FROM bans WHERE banName = '%s' AND banTime < %d", SpielerName(playerid), gettime());
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows())
    {
        format(query, sizeof(query), "DELETE FROM bans WHERE banID = %d", mysql_fetch_int());
        mysql_query(query);
    }
    else
    {
        mysql_free_result();
        format(query, sizeof(query), "SELECT banID FROM bans WHERE banName = '%s' AND banTime >= %d", SpielerName(playerid), gettime());
        mysql_query(query);
        mysql_store_result();
        if(mysql_num_rows())
        {
            Kick(playerid); //Spieler noch gebannt.
        }
    }
    mysql_free_result();

    Ich habe das ohne Compiler und ohne zu testen einfach in den Texteditor getippt, da ich grade weder pawno noch SA-MP zu Verfügung habe.
    Teste es mal aus, bzw. nimm die Änderungen vor die du brauchst und gib dann Bescheid. Falls es nicht klappt kann ich es mir später genauer anschauen, sage mir dann aber bitte genau was nicht geht.

    Dein query ist syntaktisch falsch:
    format(query,sizeof(query),"DELETE FROM `SpielerTimeBanned `Name`='%s'",unbanname);
    zu:
    format(query,sizeof(query),"DELETE FROM SpielerTimeBanned WHERE `Name`='%s'",unbanname);



    Zwecks des automatischen unbans:
    Du fragst zum Beispiel alle 10 Sekunden ab, ob es einen Ban gibt der eine EntBannZeit von kleiner als gettime hat.

    SQL
    SELECT FROM bans WHERE unbantime < %d


    für %d wird gettime() in format platziert.


    Durch das Result machst du eine Schleife und selektierst die Bans. Dann löschst du sie.



    ODER:
    Du fragst bei OnPlayerConnect ab, ob der Spieler timegebannt ist, und wenn ja schaust du ob die Zeit kleiner als gettime ist, wenn ja, enfernst du den Ban und lässt den Spieler in den Server.



    Probiere es bitte mal selbst aus, und wenn du es bis morgen nicht hinbekommen hast, postest du den Code hier, den du bis dahin hast.