Beiträge von Jeffry

    Was meinst du?


    Du müsstest schon etwas mehr Informationen von dir geben, sonst kann ich dir leider nicht wirklich helfen. Erkläre bitte ganz genau im Detail (nichts vergessen), was der Befehl machen soll und was du eingeben und abfragen willst.

    Da fehlt noch der Code vom Kauf und Verkauf, außerdem von dem Code, der bei OnPlayerPickUpPickup das Textdraw anzeigt.


    Kannst du dazu bitte noch erklären, was genau das Problem ist? Also was von den drei Bildern ist korrekt, und was sollte anders sein?

    Dann kann ich das Problem so leider nicht nachvollziehen, wenn das ein direkter Aufruf ist.
    Könntest du vielleicht von dem Problem mal ein kurzes Video hochladen, damit wir uns das Problem besser vorstellen können? Vielleicht gibt das Hinweise auf die Ursache.

    Du startest in dem Befehl einen Timer, in dem du das "i" mit gibst (d steht für Integer).
    SetTimerEx("CreateGiftAgain", 30000, false, "d", i);


    Das Callback zu dem Timer sieht dann so aus:
    forward CreateGiftAgain(i);
    public CreateGiftAgain(i)
    {
    GiftBox[i][e_oID] = CreateDynamicObject(19054, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z], 0.0, 0.0, GiftBox[i][e_a]);
    GiftBox[i][e_label] = CreateDynamic3DTextLabel("/takegift\nTo get your gift.",0x10F441AA,GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z]+0.25,8.0);
    new str[16];
    format(str, sizeof(str), "ID: %i.", i);
    GiftBox[i][e_GiftID] = CreateDynamic3DTextLabel(str,0xFF0000FF, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z]+1.10,8.0);
    return 1;
    }


    Gegegebenfalls musst du das Objekt und die Labels wieder anpassen, ich habe das von der Laden-Funktion auf der Seite zuvor genommen.

    CMD:takegift(playerid)
    {
    for(new i = 0; i < MaxGifts; i++)
    {
    if(GiftBox[i][e_x] == 0.0 && GiftBox[i][e_y] == 0.0 && GiftBox[i][e_z] == 0.0) continue;
    if(IsPlayerInRangeOfPoint(playerid, 5.0, giftPos[i][e_x], giftPos[i][e_y], giftPos[i][e_z]))
    {
    RandomGift(playerid);
    return 1;
    }
    }
    return 1;
    }


    Und:
    new randomgift = random(MaxGifts) + 1;
    zu:
    new randomgift = random(3) + 1;

    Der Fehler liegt daran, dass du mit der vehicleid auf den Index zugreifst, das beim Laden aber nicht so machst.
    Du musst es bei OnVehicleSpawn so machen, um den richtigen Index (das ist nicht die vehicleid) herauszufinden:
    public OnVehicleSpawn(vehicleid)
    {
    new engine, lights, alarm, doors, bonnet, boot, objective;
    new id = -1;
    for(new i = 0; i < sizeof(VehicleInfo); i++)
    {
    if(vehicleid == VehicleInfo[i][v_DLID])
    {
    id = i;
    break;
    }
    }
    if(id != -1)
    {
    if(VehicleInfo[id][v_Schloss] == true)
    {
    GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    doors = 1; // Türen werden geschlossen
    print("vSchloss == true");
    }
    else
    {
    GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    doors = 0; // Türen werden geöffnet
    print("vSchloss == false");
    }
    printf("doors: %d",doors);
    SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    }
    return 1;
    }

    SpielerAuto[playerid][x][aKilometer] = (Meter[SpielerAuto[playerid][x][aID]]+GetDistanceToLastPoint(SpielerAuto[playerid][x][aID])) / 250;
    zu:
    if(SpielerAuto[playerid][x][aID] > -1) SpielerAuto[playerid][x][aKilometer] = (Meter[SpielerAuto[playerid][x][aID]]+GetDistanceToLastPoint(SpielerAuto[playerid][x][aID])) / 250;

    Ah, sorry. War ein Denkfehler von mir.
    So:
    new jackpot = lottopot * (100+lottofaktor) / 100;


    Dann kommt es auf's gleiche raus.




    5 /100

    Das gibt zwar 0,05, aber da Integers keine Nachkommastellen unterstützen, wird es auf 0 abgeschnitten. Deshalb geht das nicht, und deshalb brauchst du auch kein floatround.
    Du müsstest sonst mit Floats arbeiten, das würde dann gehen.

    5/100 = 0.00000 ist.... Aber woran liegt das eigentlich sollte doch 0.05 heraus kommen?

    Das liegt daran, dass Integers nicht mit Nachkommastellen arbeiten können, also kommt 0 raus. 99/100 wäre auch 0.


    Mache es so, dann wird erst der Lottopot multipliziert:
    new jackpot = lottopot * (1+lottofaktor) / 100;

    Ah ja, stimmt, das fragst du ja da in der Mitte ab, da habe ich auch nicht drauf geachtet. Hast natürlich Recht, dann kann man das so vergessen.


    Ich denke die einfachste Variante, auch für den Nutzer, ist es, den Befehl mit 6 Parametern aufzubauen.
    Alternativ über 6 Dialoge, die nacheinander kommen.

    Versuchs mal so, die 5 Zeichen sind auf jeden Fall zu wenig gewesen, für 6 Zahlen:
    ocmd:lotto(playerid,params[])
    {
    new pzahlen[7],str[128];
    if(startetlotto == 0)return SCM(playerid,frot,"[FEHLER]: Es wurde keine Runde Lotto gestartet!");
    if(sscanf(params,"s[7]",pzahlen))return SCM(playerid,frot,"[FEHLER]: /lotto [6 Zahlen]");
    if(strlen(pzahlen) != 6)return SCM(playerid,frot,"[FEHLER]: Du musst 6 Zahlen eingeben!");
    SCM(playerid,frot,"[ZAHLEN]: %s",pzahlen);
    for(new i=0;i<6;i++)
    {
    pZahlen[playerid][i] = pzahlen[i] - 48;
    SCM(playerid,frot,"Zahl %d : %d",i+1,pZahlen[playerid][i]);
    if(pZahlen[playerid][i] < 1 || pZahlen[playerid][i] > 45)return SCM(playerid,frot,"[FEHLER]: Die Zahlen müssen zwischen 1 und 45 liegen!");
    if(i < 5)
    {
    format(str,sizeof(str),"%s %d. Zahl: %d",str,i+1,pZahlen[playerid][i]);
    continue;
    }
    format(str,sizeof(str),"%s Zusatzzahl: %d",str,pZahlen[playerid][i]);
    }
    if(GetPlayerMoney(playerid) < lottokosten)return SCM(playerid,frot,"[FEHLER]: Du brauchst %d um dir ein Los zu kaufen!",lottokosten);
    GivePlayerMoney(playerid,-lottokosten);
    lottopot += lottokosten;
    SCM(playerid,iblau,str);
    return 1;
    }


    Gegebenenfalls löst das das Problem schon.