Beiträge von Jeffry

    Wie sieht der Code dazu denn aus, so wie er momentan, mit den ganzen prints ist?
    Kannst du auch den server_log dazuposten, so wie es vor dem Absturz geprintet wurde?


    Ohne Informationen wird es ziemlich schwer dir zu helfen, du musst schon etwas posten.

    Ich hab's jetzt getestet:
    new Float:x,Float:y,Float:z;
    GetPlayerCameraPos(playerid,x,y,z);
    InterpolateCameraPos(playerid,x,y,z,664.4217, -491.6463, 27.1711,2000,CAMERA_MOVE);
    InterpolateCameraLookAt(playerid,x,y,z,664.9736, -490.8073, 26.8960,2000,CAMERA_MOVE);


    Ich schätze so willst du es, dass es sich zurück bewegt.



    IPrototypeI: Es hat sich im Kreis gedreht und dann hat's nen Ruck gemacht, an die richtige Position.

    Füge mal vor dem ersten
    if(newkeys ==262144)


    diesen print ein
    printf("newkeys=%d", newkeys);
    Welcher Wert wird dann geprintet?
    Möglicherweise hat newkeys im Auto einen anderen Wert als zu Fuß, wenn du die Taste drückst.

    CMD:Test(playerid,params[])
    {
    new File:Text, i, string[128];
    new tmp[20], tmp2[20], idx; tmp = strtok(params,idx), tmp2 = strtok(params,idx);
    if(!strlen(tmp2)) return SendClientMessage(playerid, RED, "Benutze: /test [start] [ende]");
    new start = strval(tmp);
    new ende = strval(tmp2);
    if(fexist("Text.txt"))
    {
    Text = fopen("Text.txt", io_read);
    while(fread(Text, string))
    {
    i++;
    if(i>=start && i<=ende) format(string, sizeof(string), "Gesuchter Text in Zeile %d: %s", i, string), SendClientMessage(playerid, RED, string);
    }
    }
    return 1;
    }


    Ich schätze du meinst es so.


    Dazu brauchst du noch strtok: http://wiki.sa-mp.com/wiki/Strtok

    Dachte du meintest die Funktion, die auch in dem Thread war ..
    Jedenfalls klappts nun, danke dir ! ;)


    Nein, ich bin davon ausgegangen, dass ich dir die Funktion zum Berechnen des Speeds schon gegeben hatte, hatte ich aber gar nicht, mein Fehler. Aber so redet man manchmal an sich vorbei, kommt vor :D
    Gut, dass es jetzt funktioniert, viel Spaß damit.


    Übrigens sehe ich grade noch, das
    GetPlayerFacingAngle(playerid, a);
    kannst du aus der Funktion entfernen, das hat keine Verwendung (mehr) in der Funktion.

    stock GetPlayerSpeed_New(playerid, &Float:speed) // By: [XST]O_x
    {
    new Float:ST[4];
    if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid)!=PLAYER_STATE_PASSENGER)
    GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
    else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
    ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 100.3;
    speed = ST[3];
    return 1;
    }
    Warum sagst du nicht, dass ich die Funktion dir noch nie gegeben habe. :D
    Ich dachte die hätte ich dir schonmal gegeben, scheint wohl nicht so.


    new Float:speed; GetPlayerSpeed_New(playerid,speed);
    printf("Speed: %f",speed);


    Ich hab sie gleich umbenannt, damit du nicht durcheinander kommst.

    if(speed >= 38.0 && speed <= 40.0){ // Das ist ja klar, dass ich das bearbeitet habe..
    Nein, weil bei dem GetPlayerSpeed von mir wird er NIE 38 km/h rennen, sondern maximal was um die 25. ;)


    if(speed >= 20.0 && speed <= 40.0){


    Deshalb sagte ich, probier es zuerst genau so wie ich es gemacht habe.

    Können wir uns darauf einigen, dass die IDs bei 0 anfangen? Du wechselst das nämlich nach Belieben ab, das macht wenig Sinn. ;)


    public Pfandadd()
    {
    new str[3], count, query[128], exists[MAX_TONNEN];
    for(new i=0;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    exists[i] = 1;
    printf("Exists: %d -> count = %d", i, count);
    }
    new rand = random(count), tmp;
    for(new i=0; i<MAX_TONNEN; i++)
    {
    if(exists[i] == 1)
    {
    if(tmp == rand)
    {
    rand = i;
    break;
    }
    tmp++;
    }
    }
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!count)
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    print("Es konnten keine Pfandflaschen an ID: ? übermittelt werden!");
    }
    else
    {
    KillTimer(Tonnentimer);
    new rand1 = 1 + random(11);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+%i WHERE id=%i",rand1, rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 10000, true);
    printf("Es wurden %i Pfandflaschen an ID: %i übermittelt!",rand1,rand);
    }
    mysql_free_result();
    return 1;
    }


    Zwischenspeichern und dann den random-Wert auslesen. Müsste passen.

    Ja also gibt es ja ne Möglichkeit :p


    Ja, das stimmt, aber das schält nicht die "Vehicle Collisions" aus. Und bei Laggern wird auch der Code nur bedingt funktionieren. Und spätestens wenn du drei Autos nebeneinander hast wird es kräftig scheppern, weil dann ein Spieler in den anderen reingesetzt wird, dann zieht, je nach Ping einer den Kürzeren und fliegt weg. :D


    Man müsste das unter OnPlayerUpdate setzen, und jeweils noch prüfen, dass keine Objekte neben dem Spieler sind wo er hingesetzt wird, sonst bringt das auch nichts, wenn er dann in einem Objekt hängt.
    Zudem müsste man noch beurteilen, welcher Spieler weg-gesetzt wird, oder ob beide ein Stück weg-gesetzt werden (wohl das beste).


    Also das ist zwar eine Möglichkeit, aber besonders toll zum Spielen ist die nicht.

    Von irgendwo bekommt der Spieler einen Schuss der AK47.
    Möglicherweise liegt es auch einfach daran, dass die GetPlayerWeaponData - Funktion nicht gescheit funktioniert, das Problem habe ich vor Jahren gemeldet, scheint niemanden zu interessieren.


    Ich habe das so umgangen, in dem ich einfach erst banne, wenn der Spieler 2 Schuss hat.


    if(Muni > BuyedWeapons[playerid][Waffen] && Muni > 1)


    Bleibt zu hoffen, dass sich keiner eine Kugel cheatet, wobei dafür hat man ja auch Admins.

    Aber wenn ich das return weglasse bekomme ich die warnung SERVER: Unknown command? :S


    Bei OnPlayerCommandText, ja. Weil dort ist "return 1" = keine Nachricht und "return 0" = Unknown Command. Das siehst du, weil da steht gaaaanz am Ende von OnPlayerCommandText ein return 0. Bei Befehlen arbeitest du aber ja mit der Struktur aus dem zweiten Beispiel (IF). Wird ein Befehl ausgeführt (irgendwas = wahr), dann kannst du return 1 machen, da dich der Rest dann nicht mehr interessiert.
    Es kommt immer auf die Situation an, wann du was benutzen musst.

    Ach, natürlich! Gut, dass so ein Debug einem immer auf die Sprünge hilft.
    random(0) ist ja auch Käse.^^


    public Pfandadd()
    {
    new str[3], count, query[128];
    for(new i=0;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    printf("Exists: %d -> count = %d", i, count);
    }
    if(count == 0)
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    print("Es wurde keine Tonne gefunden!");
    }
    new rand = 1 + random(count);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!mysql_num_rows())
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    printf("Es konnten keine Pfandflaschen an ID: %i übermittelt werden!",rand);
    }
    else
    {
    KillTimer(Tonnentimer);
    new rand1 = 1 + random(11);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+%i WHERE id=%i",rand1, rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 10000, true);
    printf("Es wurden %i Pfandflaschen an ID: %i übermittelt!",rand1,rand);
    }
    mysql_free_result();
    return 1;
    }

    1.) Das macht der Precompiler direkt zu dem Wert der es sein soll. Beispiel:
    #define TEST 900000


    public OnFilterScriptInit()
    {
    new test[1000000-TEST][10];
    test[100415][4] = 1; //error 032: array index out of bounds (variable "test")
    return 1;
    }



    2.) Das macht auch der Precompiler, da du ja auch sowas machen kannst, außerhalb eines Callbacks, daher muss die Funktion vom Precompiler schon verwendet werden.
    new test2[sizeof(test)];

    fällt mir spontan keine Erklärung dazu ein, debugge es mal, vielleicht bringt das die Lösung:


    public Pfandadd()
    {
    new str[3], count, query[128];
    for(new i=1;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    printf("Exists: %d -> count = %d", i, count);
    }
    new rand = 1 + random(count);
    printf("rand = %d | count = %d", rand, count);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!mysql_num_rows())
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    printf("Es konnten keine Pfandflaschen an ID: %i übermittelt werden!",rand);
    }
    else
    {
    KillTimer(Tonnentimer);
    new rand1 = 1 + random(11);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+%i WHERE id=%i",rand1, rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 10000, true);
    printf("Es wurden %i Pfandflaschen an ID: %i übermittelt!",rand1,rand);
    }
    mysql_free_result();
    return 1;
    }


    Was wird geprintet, wenn dieser Code aufgerufen wird (bitte einmal mit und einmal ohne Tonnen in der DB).

    if(!mysql_field_rows())
    gibt es nicht, zumindest steht es nicht im Wiki. Hast du das selbst erstellt?
    Wenn nicht:


    if(!mysql_num_rows())



    Wie viele Tonnen hast du denn, das sind ja riesige Zahlen!?