Beiträge von Jeffry

    Ohh, sorry da habe ich gepennt.
    stock IsPlayerInGFZone(playerid)
    {
    new Float:GetX,Float:GetY,Float:GetZ;
    GetPlayerPos(playerid,GetX,GetY,GetZ);
    printf("Pos: %f/%f/%f", GetX, GetY, GetZ);
    for(new i;i<MAX_ZONES;i++)
    {
    printf("%f / %f | %f / %f", Zone[i][gMinX], Zone[i][gMaxX], Zone[i][gMinY], Zone[i][gMaxY]);
    if(Zone[i][gMinX] <= GetX && Zone[i][gMaxX] >= GetX && Zone[i][gMinY] <= GetY && Zone[i][gMaxY] >= GetY) return i;
    printf("Nein.");
    }
    return -1;
    }


    Dann dürfte es klappen.

    Dann schreibe die Funktion so, und poste dann was im Server Log steht, wenn du den Befehl eingibst:
    stock IsPlayerInGFZone(playerid)
    {
    new Float:GetX,Float:GetY,Float:GetZ;
    GetPlayerPos(playerid,GetX,GetY,GetZ);
    printf("Pos: %f/%f/%f", GetX, GetY, GetZ);
    for(new i;i<MAX_ZONES;i++)
    {
    printf("%f / %f | %f / %f", Zone[i][gMinX], Zone[i][gMaxX], Zone[i][gMinY], Zone[i][gMaxY]);
    if(Zone[i][gMinX] <= GetX && Zone[i][gMaxX] >= GetX && Zone[i][gMinY] <= GetY && Zone[i][gMaxY] >= GetY) return i;
    printf("Nein.");
    }
    return -1;
    }

    Ändere die Funktion zu:
    stock IsPlayerInGFZone(playerid)
    {
    new Float:GetX,Float:GetY,Float:GetZ;
    GetPlayerPos(playerid,GetX,GetY,GetZ);
    for(new i;i<MAX_ZONES;i++)
    {
    if(Zone[i][gMinX] <= GetX && Zone[i][gMaxX] >= GetX && Zone[i][gMinY] <= GetY && Zone[i][gMaxY] >= GetY) return i;
    }
    return -1;
    }

    mysql_query(Query);
    zu:
    printf("Query: %s", Query);
    mysql_query(Query);


    Was wird dann geprintet, wenn du den Spieler speichern lässt, nachdem du ihn registriert hast, und ihm das Level gegeben hast?


    Alternativ, ändere in der Datenbank mal die 1339 zu dem Level das du haben willst, logge dich dann ein und wieder aus, was steht dann im Log?

    Mache einen Thread auf, da das keine kleine Scripting Frage ist, das siehst du auch an der Länge des Codes.
    Dort poste zu diesem Code auch die Koordinaten der Zonen, und erkläre was das Problem ist (welche Nachricht kommt?).

    Du musst die Größe das anklickbaren Bereiches mit TextDrawTextSize anpassen. https://wiki.sa-mp.com/wiki/TextDrawTextSize Der X Wert ist die Position PLUS die Größe des nach rechts anklickbaren Bereiches. Der Y Wert ist die geschätzte Höhe.


    Angenommen du erstellst dein Textdraw bei X = 120 und Y = 90. Dann machst du den Text "Hallo Welt" da rein. Sagen wir, der Text ist so groß, dass er in etwa über ein Zehntel deines Bildschirmes geht (musst du abschätzen, oder mit einem Lineal abmessen), dann heißt das 640 durch 10, das wäre 64. Somit ist TextDrawTextSize-X = 120 + 64 = 184.
    Nun misst, bzw. schätzt, du die Höhe des Textdraws, sagen wir mal du bekommst den Text in etwa 20 mal untereinander hin, bis dein Bildschirm von oben nach unten voll damit wäre. Heißt also: 480 durch 20, das gibt 24. Somit wäre TextDrawTextSize-Y = 24.

    jetzt allerdings speichert er nicht den Besitzer an.


    Sorry für die späte Antwort, ich habe momentan relativ wenig Zeit.


    saveHouse(id)
    {
    new query[128];
    format(query,sizeof(query),"UPDATE haus SET besitzer='%s', preis'%i', kauflevel'%i' WHERE id='%i'",HouseInfo[id][hBesitzer],HouseInfo[id][hPreis],HouseInfo[id][hKauflevel],HouseInfo[id][hID]);
    printf("saveHouse-Query: %s", query);
    mysql_function_query(dbhandle,query,false,"","");
    return 1;
    }
    Lass es dir mal so printen, was dann im Server Log steht.

    Auf Anfrage in PN:


    Das liegt daran, dass in der Zeit, die zwischen absenden des Queries und aufrufen des Callbacks vergeht, der Spieler in die Class Selection gelangt (sind ein paar Millisekunden). Das ist deshalb der Fall, weil der Server nach dem Query-Absenden weiter läuft (was der Sinn dahinter ist, damit es nicht zu Lags kommt).
    Wenn du das umgehen willst, dann kannst du mysql_query verwenden, und direkt danach (ohne Callback) den Cache auslesen, dann wartet der Server die Zeit ab, bis der Cache da ist, und der Spieler sollte nicht gespawnt werden, bevor er sich eingeloggt hat.


    Beispiel: http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_query
    Der zu ändernde Code dürfte bei dir unter OnPlayerConnect stehen.

    Es liegt daran, dass du dem Spieler erst den Checkpoint anzeigst, und ihn dann ganz unten entfernst.
    Schreibe es so:
    public OnPlayerEnterCheckpoint(playerid)
    {
    printf("OnPlayerEnterCheckpoint: %d", playerid);
    DisablePlayerCheckpoint(playerid);
    if(GetPVarInt(playerid, "trash_job"))
    {
    //Wenn trash job ausgeführt wird
    new cID = GetPVarInt(playerid, "trash_cp");
    if(IsPlayerInRangeOfPoint(playerid, 5, tCPs[cID][t_x], tCPs[cID][t_y], tCPs[cID][t_z]))
    {
    cID++;


    if(cID >= sizeof(tCPs))
    {
    GivePlayerMoney(playerid, 3000);
    SetPVarInt(playerid, "trash_cp", 0);
    SetPlayerCheckpoint(playerid, tCPs[0][t_x], tCPs[0][t_y], tCPs[0][t_z], 5);
    SendClientMessage(playerid,helblau,"Du hast soeben 3.000$ verdient");
    }
    else
    {
    SetPVarInt(playerid, "trash_cp", cID);
    SetPlayerCheckpoint(playerid, tCPs[cID][t_x], tCPs[cID][t_y], tCPs[cID][t_z], 5);
    }
    return 1;
    }
    }
    printf("bus_job: %d -> CP: %d", GetPVarInt(playerid,"bus_job"), GetPVarInt(playerid,"bus_cp"));
    if(GetPVarInt(playerid,"bus_job") == 1)
    {
    //wenn bus_job ausgeführt wird.
    new bID = GetPVarInt(playerid,"bus_cp");
    if(IsPlayerInRangeOfPoint(playerid,7,bust1cps[bID][g_x],bust1cps[bID][g_y],bust1cps[bID][g_z]))
    {
    bID++;
    if(bID >= sizeof(bust1cps))
    {
    GivePlayerMoney(playerid,6000);
    SetPVarInt(playerid,"bus_cp",0);
    SetPlayerCheckpoint(playerid,bust1cps[bID][g_x],bust1cps[bID][g_y],bust1cps[bID][g_z],5);
    SendClientMessage(playerid,rot,"Du hast soeben 6.000$ verdient");
    }
    else
    {
    SetPVarInt(playerid,"bus_cp",bID);
    SetPlayerCheckpoint(playerid,bust1cps[bID][g_x],bust1cps[bID][g_y],bust1cps[bID][g_z],5);
    }
    }
    }


    else if(GetPVarInt(playerid,"bus_job") == 2)
    {
    //wenn bus_job ausgeführt wird.
    new bID = GetPVarInt(playerid,"bus_cp");
    if(IsPlayerInRangeOfPoint(playerid,7,bust2cps[bID][v_x],bust2cps[bID][v_y],bust2cps[bID][v_z]))
    {
    bID++;
    if(bID >= sizeof(bust2cps))
    {
    GivePlayerMoney(playerid,12000);
    SetPVarInt(playerid,"bus_cp",0);
    SetPlayerCheckpoint(playerid,bust2cps[bID][v_x],bust2cps[bID][v_y],bust2cps[bID][v_z],5);
    SendClientMessage(playerid,rot,"Du hast soeben 12.000$ verdient");
    }
    else
    {
    SetPVarInt(playerid,"bus_cp",bID);
    SetPlayerCheckpoint(playerid,bust2cps[bID][v_x],bust2cps[bID][v_y],bust2cps[bID][v_z],5);
    }
    }
    }
    else if (GetPVarInt(playerid,"bus_job") == 3)
    {
    new bID = GetPVarInt(playerid,"bus_cp");
    if(IsPlayerInRangeOfPoint(playerid,7,bust3cps[bID][n_x],bust3cps[bID][n_y],bust3cps[bID][n_z]))
    {
    bID++;
    if(bID >= sizeof(bust3cps))
    {
    GivePlayerMoney(playerid,15000);
    SetPVarInt(playerid,"bus_cp",8);
    SetPlayerCheckpoint(playerid,bust3cps[bID][n_x],bust3cps[bID][n_y],bust3cps[bID][n_z],5);
    SendClientMessage(playerid,rot,"Du hast soeben 15.000$ verdient");
    }
    else
    {
    SetPVarInt(playerid,"bus_cp",bID);
    SetPlayerCheckpoint(playerid,bust3cps[bID][n_x],bust3cps[bID][n_y],bust3cps[bID][n_z],5);
    }
    }
    }
    else if(GetPVarInt(playerid,"bus_job") == 4)
    {
    new bID = GetPVarInt(playerid,"bus_cp");
    if(IsPlayerInRangeOfPoint(playerid,7,bust4cps[bID][m_x],bust4cps[bID][m_y],bust4cps[bID][m_z]))
    {
    bID++;
    if(bID >= sizeof(bust4cps))
    {
    GivePlayerMoney(playerid,30000);
    SetPVarInt(playerid,"bus_cp",8);
    SetPlayerCheckpoint(playerid,bust4cps[bID][m_x],bust4cps[bID][m_y],bust4cps[bID][m_z],5);
    SendClientMessage(playerid,rot,"Du hast soeben 30.000$ verdient");
    }
    else
    {
    SetPVarInt(playerid,"bus_cp",bID);
    SetPlayerCheckpoint(playerid,bust4cps[bID][m_x],bust4cps[bID][m_y],bust4cps[bID][m_z],5);
    }
    }
    }
    return 1;
    }



    Das hatte ich dir aber bereits in Post 3 gesagt:
    Busjob befehl+ Liniendialog



    EDIT: (Post unten)
    Blackshadowscript: Gerne ;)

    Das war was ich meinte, man müsste es komplett anders machen. Das wäre eine Möglichkeit, allerdings ist auch hier das Limit eben drin, von 90.000 Nummern.
    Ich würde das ganze insofern vereinfachen, dass man die DB_ID nimmt, die der Spieler hat, und damit eine Nummer erstellt, das würde auf jegliches Query verzichten.


    stock Nummer(playerid)
    {
    new tmp[11];
    format(tmp, sizeof(tmp), "%d%d", random(1100)+1000, SpielerInfo[playerid][db_id]);
    return strval(tmp);
    }


    Dann kommt für den Spieler mit der db_id 2401 zum Beispiel diese Telefonnummer raus:
    14032401


    Man wäre dann nur dahingehend beschränkt, wenn man das 32-Bit Limit erreicht, sprich ab User ID 1 Mio.


    Oder, wenn man wieder die 100.000 haben will, geht es auch so:
    stock Nummer(playerid)
    {
    new tmp[11];
    format(tmp, sizeof(tmp), "%d%d", random(9000)+1000, SpielerInfo[playerid][db_id]);
    return strval(tmp);
    }
    Man muss eben bedenken, dass bei 2^31-1 Schluss ist.


    Ansonsten müsste man die Telefonnummer in einem String speichern, dann sähe es einfach so aus:
    stock Nummer(playerid)
    {
    new tmp[32];
    format(tmp, sizeof(tmp), "%d%d", random(90000)+10000, SpielerInfo[playerid][db_id]);
    return tmp;
    }
    Das hat dann so gut wie keine Grenze (eine die unter normalen Umständen nicht erreicht werden kann).


    Sowas ähnliches haben wir auch hier schonmal gehabt: Spawn funktioniert nicht?
    Durch die User-ID an sich ist es eben schon unmöglich, dass zwei Leute die gleiche Nummer bekommen, da ja jeder eine andere User ID hat, Plus eine X-Beliebige Zufallszahl, mit einer festen Anzahl an Stellen.
    Wobei dort noch eine zusätzliche Prüfung eingebaut ist (die wie beschrieben aber nie wahr sein kann, aber sicher ist sicher).

    if(clickedid == Textdraw15) //Register
    {
    new query[500];
    mysql_format(handle, query, sizeof(query), "SELECT Username FROM Accounts WHERE Username = '%e'", pName(playerid));
    mysql_pquery(handle, query, "AccountCheck", "d", playerid);
    }


    forward AccountCheck(playerid);
    public AccountCheck(playerid)
    {
    new num_rows, num_fields;
    cache_get_data(num_rows, num_fields, handle);
    if(num_rows == 1) return SendClientMessage(playerid, COLOR_WHITE, "Du hast bereits einen Account!");
    if(strlen(PlayerInfo[playerid][dPassword]) <= 6) return SendClientMessage(playerid, COLOR_WHITE, "Dein Passwort ist zu kurz mind. 6 Zeichen!");
    new query[500];
    mysql_format(handle, query, sizeof(query), "INSERT INTO Accounts (Username, Password) VALUES ('%e', MD5('%e'))", pName(playerid), PlayerInfo[playerid][dPassword]);
    mysql_pquery(handle, query);
    SendClientMessage(playerid, COLOR_WHITE, "Du hast dir erfolgreich ein Account erstellt!");
    return 1;
    }