Beiträge von Jeffry

    Ok, dann mache es so, umgehen wir das.
    Dort wo du Tank deklariert hast:
    new Tank[MAX_VEHICLES];
    zu:
    new Tank[MAX_VEHICLES] = {-999,...};
    (Das ... genau so lassen.)



    Und dann dort wo du
    Tank[car] = GetVehicleMaxTank(v);
    weg gemacht hast, füge das ein:
    if(Tank[car] == -999) Tank[car] = GetVehicleMaxTank(v);


    Somit heißt -999, dass das Fahrzeug noch nie betreten worden ist.

    Nein, das fragst du so ab:
    if(GetVehicleTankArt(modelID) == 0)
    {
    //Diesel
    }
    else if(GetVehicleTankArt(modelID) == 1)
    {
    //Benzin
    }
    Oder eben mit einem switch.


    Wann sagt er dir, dass du keinen Tank mehr hast (=leerer Tank, oder?)? Direkt nach dem Server-Start oder nachdem du das Fahrzeug betankt hast?
    Geht das tanken?

    Willkommen auf Breadfish!


    Öffne pawno über die pawno.exe die in C:\Users\Tirolerhof\Desktop\Neuer Ordner (4)\pawno\pawno.exe liegt.
    Dann gehe dort auf Öffnen und wähle deinen Gamemode aus, dann sollte es klappen, vorausgesetzt die Include liegt in C:\Users\Tirolerhof\Desktop\Neuer Ordner (4)\pawno\includes\.

    Du könntest es mit einer Variable machen, das wäre performanter und weniger Code:
    {
    new Hecht[24], bool:tmp[500];
    for(new i = 0; i < sizeof(Hecht); i++)
    {
    Hecht[i] = random(500);
    if(tmp[Hecht[i]]) i--;
    else tmp[Hecht[i]] = true;
    }
    //etc...
    }
    Man kann es natürlich noch zusammenquetschen, falls dir das lieb ist:

    Spoiler anzeigen
    {
    new Hecht[24], bool:tmp[500];
    for(new i = 0; i < sizeof(Hecht); i++) {
    Hecht[i] = random(500);
    if(tmp[Hecht[i]]) i--; else tmp[Hecht[i]] = true;
    }
    //etc...
    }

    Oder es mit weniger zu ersetzen schreiben (Hecht):
    Spoiler anzeigen
    {
    new Hecht[24], bool:tmp[500], rand;
    for(new i = 0; i < sizeof(Hecht); i++) {
    rand = random(500), Hecht[i] = rand;
    if(tmp[rand]) i--; else tmp[rand] = true;
    }
    //etc...
    }


    Um die Zellen zusammenzurechnen kannst du sizeof verwenden.
    new anzahlZellen = sizeof(Hecht) + sizeof(Forelle) + usw... ;

    1.)
    Entferne bei Motor an/aus das:
    Tank[car] = GetVehicleMaxTank(v);


    2.)
    for (new i=0; i< MAX_PLAYERS; i++)
    {
    if(GetVehicleTankArt(i) == 1) {
    SetTimer("BenzinVerlust", BENZIN, true);
    }
    else if(GetVehicleTankArt(i) == 0) {
    SetTimer("DieselVerlust", DIESEL, true);
    }
    }
    zu:
    SetTimer("BenzinVerlust", BENZIN, true);
    SetTimer("DieselVerlust", DIESEL, true);


    Und die Timer so verwenden, wie du es zuerst hattest:

    Spoiler anzeigen
    public BenzinVerlust()
    {
    for(new i=0; i<MAX_VEHICLES; i++)
    {
    if (Motor[i] == true && GetVehicleTankArt(GetVehicleModel(i)) == 0)
    {
    Tank[i]-=1;
    if (Tank[i]<1)
    {
    Tank[i] = 0;
    GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[i] = false;
    }
    }
    }
    return 1;
    }
    public DieselVerlust()
    {
    for(new i=0; i<MAX_VEHICLES; i++)
    {
    if (Motor[i] == true && GetVehicleTankArt(GetVehicleModel(i)) == 0)
    {
    Tank[i]-=1;
    if (Tank[i]<1)
    {
    Tank[i] = 0;
    GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[i] = false;
    }
    }
    }
    return 1;
    }

    Aber bis zu welcher Anzahl denkt ihr ist es unproblematisch


    Bis zum Limit der maximal erstellbar und anzeigbarer Textdraws. Ich hatte das Limit einmal testweise ausgeschöpft und alle auf einmal angezeigt. Das hat zwar kurz gedauert, ein zwei Sekunden, aber ansonsten gab es keine Probleme.
    http://wiki.sa-mp.com/wiki/Limits


    GTA SA braucht ja an sich kaum Grafik Leistung, ich denke nicht, dass es da bei den heutigen Rechnern zu Problemen kommt.

    Hast du auch
    SaveTanke(b);
    nach dem Update3DTextTanke eingefügt?


    Schreibe den stock bitte so:
    stock SaveTanke(i)
    {
    format(string, sizeof(string),"SELECT * FROM `tankenbiz` WHERE `TankenBizID` = '%d'", i);
    printf("string: %s", string);
    self_mysql_queryEx(string);
    mysql_store_result(MySQLConnection);
    if(mysql_num_rows(MySQLConnection) == 0)
    {
    format(string, sizeof(string), "INSERT INTO `tankenbiz` (`TankenBizID`) VALUES ('%d')", i);
    printf("string: %s", string);
    self_mysql_queryEx(string);
    }
    mysql_free_result(MySQLConnection);
    new var[768];
    format(var, sizeof(var), "UPDATE `tankenbiz` SET `Owned`='%d', `Owner`='%s', `Message`='%s', `Extortion`='%s', `LevelNeeded`='%d', `KaufPreis`='%d', `SpritPreis`='%d', `Kasse`='%d', `Locked`='%d', `Products`='%d', `MaxProducts`='%d', `ProdPreis`='%d' WHERE `TankenBizID`='%d'",
    TankenBizInfo[i][TBOwned],
    TankenBizInfo[i][TBOwner],
    TankenBizInfo[i][TBMessage],
    TankenBizInfo[i][TBExtortion],
    TankenBizInfo[i][TBLevelNeeded],
    TankenBizInfo[i][TBKaufPreis],
    TankenBizInfo[i][TBSpritPreis],
    TankenBizInfo[i][TBKasse],
    TankenBizInfo[i][TBLocked],
    TankenBizInfo[i][TBProducts],
    TankenBizInfo[i][TBMaxProducts],
    TankenBizInfo[i][TBProdPreis],
    i);
    printf("var: %s", var);
    self_mysql_queryEx(var);
    return 1;
    };
    Dann kaufe dir eine Tankstelle und poste was im Server Log steht, wenn du die gekauft hast.

    Ok, super!


    Also, die einfachste und für dich sicher am verständlichste Methode ist, dass du zwei Timer erstellst, einen BenzinTimer und einen DieselTimer. Die Aufrufzeit des Timers stellst du dann entsprechend ein. In dem Timer-callback machst du dann eine Schleife durch alle Spieler und dann fragst du ab, ob die TankArt des Fahrzeugs des Spielers Benzin (im BenzinTimer) oder Diesel (im DieselTimer) ist. Wenn ja, dann ziehst du 1 ab.


    Zwecks den Preisen:
    Da fragst du auch mit der TankArt ab, was getankt wurde, und rechnest das entsprechend auf.



    Probiere es für beides erst mal selbst, und wenn du nicht nicht mehr weiter kommst, dann poste bitte den jeweiligen Code und erkläre wo du nicht mehr weiter kommst, kennst du ja schon. ;)

    Ah, das habe ich nicht mehr gesehen, das hast du hinzugefügt während ich gepostet habe.
    Schreibe es so:
    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    new v = GetPlayerVehicleID(playerid);
    new m = GetVehicleModel(v);
    if(GetVehicleModel(v) != 509 && GetVehicleModel(v) != 481 && GetVehicleModel(v) != 510)
    {
    new name[32];
    new string[125];
    switch(GetVehicleTankArt(m))
    {
    case 0: name = "Diesel";
    case 1: name = "Benzin";
    }
    if(Tank[v] < 10)format(string,sizeof string,"Tankart: %s~n~~w~Tank: ~r~%i ~w~liter~n~Km: 0000012~g~%d ~w~",name,Tank[v]);
    else if(Tank[v] < 20)format(string,sizeof string,"Tankart: %s~n~~w~Tank: ~y~%i ~w~liter~n~Km: 0000012~g~%d ~w~",name,Tank[v]);
    else format(string,sizeof string,"Tankart: %s~n~~w~Tank: ~g~%i ~w~liter~n~Km: 0000012~g~%d ~w~",name,Tank[v]);
    PlayerTextDrawSetString(playerid,CarTankart[playerid],string);
    }
    }
    else
    {
    //TextDrawSetString(Anzeige[playerid], " ");
    }


    Zitat

    Wie meinst du das?


    Dass zum Server-Start die Fahrzeuge einen vollen Tank haben.

    Ok, dann ändere mal das:
    SetTimer("BenzinVerlust", VERLUST, true);
    for (new v=0; v< MAX_VEHICLES; v++)
    {
    GetVehicleParamsEx(v,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(v,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[v] = false;
    Tank[v] = GetVehicleMaxTank(v);
    }
    ab zu:
    SetTimer("BenzinVerlust", VERLUST, true);
    SetTimer("SetMaxTank", 3000, false);
    und das ganz unten in Gamemode:
    forward SetMaxTank();
    public SetMaxTank()
    {
    for (new v=0; v< MAX_VEHICLES; v++)
    {
    GetVehicleParamsEx(v,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(v,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[v] = false;
    Tank[v] = GetVehicleMaxTank(GetVehicleModel(v));
    }
    return 1;
    }
    Dann sollte das am Anfang auch klappen. (Ich hoffe, du hast die zwei stocks im Code für GetVehicleMaxTank und das andere).


    Und was ist mit der Tankanzeige? Kannst du den Code dazu mal posten?

    Schreibe die Callbacks auf jeden Fall mal so:
    public BenzinVerlust()
    {
    for(new i=0; i<MAX_VEHICLES; i++)
    {
    if (Motor[i] == true)
    {
    Tank[i]-=1;
    if (Tank[i]<1)
    {
    Tank[i] = 0;
    GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[i] = false;
    }
    }
    }
    return 1;
    }


    public Auftanken(playerid)
    {
    new car = GetPlayerVehicleID(playerid);
    new m = GetVehicleModel(car);
    Tank[car]+=1;
    if(Tank[car] >= GetVehicleMaxTank(m))
    {
    TanktGerade[car] = false;
    Tank[car] = GetVehicleMaxTank(m);
    SendClientMessage(playerid, erfolg, "Dein Fahrzeug wurde %i€ vollgetankt.");
    TogglePlayerControllable(playerid,1);
    KillTimer(tanktimer[playerid]);
    }
    return 1;
    }


    Das mit den unterschiedlichen Tanks schauen wir an, wenn es erst mal so funktioniert.


    Kannst du so das Fahrzeug auftanken?
    Kannst du den Motor starten?
    Hast du das setzen des vollen Tanks am Anfang vor oder nach dem erstellen der Fahrzeuge?

    [20:03:42] CMySQLHandler::Connect() - Access denied for user 'kd1016_34'@'o027.orange.servdiscount-customer.com' (using password: YES) (Error ID: 1045)
    Wenn diese Daten stimmen, dann solltest du dich mit deinem Hoster in Verbindung setzen, dann stimmen die Berechtigungen nicht.
    Am besten du gibst ihm diese Meldung und fragst zwecks den Berechtigungen nach.



    EDIT: (Post unten):
    Nyu_x3: Alles klar, kannst ja dann Bescheid sagen, ob es dein Problem gelöst hat. :)

    In dem Gamemode den du kompilierst. Suche einfach danach mit STRG+F.
    Danach kompiliere den Gamemode und starte den Server nochmal, dann poste was in der mysql_log.txt steht (zuvor natürlich leeren, das alte Zeug brauchen wir nicht mehr).

    Du hast keinen Tank? Die Nachricht sehe ich nicht.


    Aber ändere mal:
    else if (GetVehicleMaxTank(car) < 1)
    zu:
    else if(Tank[car] < 1)


    Dann zeige nochmal wie du die Fahrzeuge lädst und den Tank auf voll setzt.
    Und zeige den Tanken Befehlt.

    Ok, ich zeige es dir an einem Beispiel.
    Erstelle diesen Stock:
    stock SaveTanke(i)
    {
    format(string, sizeof(string),"SELECT * FROM `tankenbiz` WHERE `TankenBizID` = '%d'", i);
    self_mysql_queryEx(string);
    mysql_store_result(MySQLConnection);
    if(mysql_num_rows(MySQLConnection) == 0)
    {
    format(string, sizeof(string), "INSERT INTO `tankenbiz` (`TankenBizID`) VALUES ('%d')", i);
    self_mysql_queryEx(string);
    }
    mysql_free_result(MySQLConnection);
    new var[768];
    format(var, sizeof(var), "UPDATE `tankenbiz` SET `Owned`='%d', `Owner`='%s', `Message`='%s', `Extortion`='%s', `LevelNeeded`='%d', `KaufPreis`='%d', `SpritPreis`='%d', `Kasse`='%d', `Locked`='%d', `Products`='%d', `MaxProducts`='%d', `ProdPreis`='%d' WHERE `TankenBizID`='%d'",
    TankenBizInfo[i][TBOwned],
    TankenBizInfo[i][TBOwner],
    TankenBizInfo[i][TBMessage],
    TankenBizInfo[i][TBExtortion],
    TankenBizInfo[i][TBLevelNeeded],
    TankenBizInfo[i][TBKaufPreis],
    TankenBizInfo[i][TBSpritPreis],
    TankenBizInfo[i][TBKasse],
    TankenBizInfo[i][TBLocked],
    TankenBizInfo[i][TBProducts],
    TankenBizInfo[i][TBMaxProducts],
    TankenBizInfo[i][TBProdPreis],
    i);
    self_mysql_queryEx(var);
    return 1;
    };
    Das ist einfach aus der Speicher-Funktion kopiert, nur ohne die Schleife.


    Dann füge nach
    Update3DTextTanke(b);
    das hier ein:
    SaveTanke(b);


    Dann kaufe dir eine Tanke und schau ob es gespeichert wurde.

    tvbox[playerid] = CreatePlayerTextDraw(playerid,636.399963, 309.873321, "usebox");
    PlayerTextDrawUseBox(playerid, tvbox[playerid], 1);
    PlayerTextDrawBoxColor(playerid, tvbox[playerid], 0x00000066);
    PlayerTextDrawLetterSize(playerid,tvbox[playerid], 1.000000, 9.390002);
    PlayerTextDrawTextSize(playerid,tvbox[playerid], 463.600006, 0.000000);
    PlayerTextDrawAlignment(playerid,tvbox[playerid], 1);
    PlayerTextDrawColor(playerid,tvbox[playerid], 0xFF0000FF);
    PlayerTextDrawUseBox(playerid,tvbox[playerid], true);
    PlayerTextDrawBoxColor(playerid,tvbox[playerid], 102);
    PlayerTextDrawSetShadow(playerid,tvbox[playerid], 0);
    PlayerTextDrawSetOutline(playerid,tvbox[playerid], 0);
    PlayerTextDrawFont(playerid,tvbox[playerid], 0);


    forward tvboxTimer();
    public tvboxTimer()
    {
    new str[256], pname[MAX_PLAYER_NAME];
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || tvID[i] != -1)
    {
    GetPlayerName(tvID[i], pname, MAX_PLAYER_NAME);
    format(str, sizeof(str), "%s (ID: %d)", pname, tvID[i]);
    PlayerTextDrawSetString(i, tvbox[i], str);
    PlayerTextDrawShow(i, tvbox[i]);
    }
    else PlayerTextDrawHide(i, tvbox[i]);
    }
    return 1;
    }


    Bei OnGameModeInit:
    SetTimer("tvboxTimer", 1000, true);


    Dann solltest du, wenn du jemanden TV'st, den Name sehen, des Spielers den du TV'st.