Beiträge von Jeffry

    Dann dürfte es so eigentlich klappen:
    CMD:giftlist(playerid,params[])
    {
    new str[MaxGifts*20];
    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;
    format(str, sizeof(str), "%sGiftbox (ID: %i)\n", str, i);
    }
    if(strlen(str)) ShowPlayerDialog(playerid, DIALOG_GIFTLIST, DIALOG_STYLE_LIST, "Gift List", str, "Ok", "");
    else SendClientMessage(playerid, 0xFF0000FF, "Error: Es wurde kein Geschenk erstellt.");
    return 1;
    }

    CMD:giftlist(playerid,params[])
    {
    new str[512];
    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;
    format(str, sizeof(str), "%sGiftbox (ID: %i)\n", str, i);
    }
    if(strlen(str)) ShowPlayerDialog(playerid, DIALOG_GIFTLIST, DIALOG_STYLE_MSGBOX, "Gift List", str, "Ok", "");
    else SendClientMessage(playerid, 0xFF0000FF, "Error: Es wurde kein Geschenk erstellt.");
    return 1;
    }

    Die Funktion ist falsch (id muss returnt werden), sie muss so aussehen:
    stock getClosestGift(playerid)
    {
    new id = -1, Float:tmp, Float:dist=15.0;
    for(new i = 0; i<MaxGifts; i++)
    {
    tmp = GetPlayerDistanceFromPoint(playerid, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z]);
    if(tmp < dist)
    {
    dist = tmp;
    id = i;
    }
    }
    return id;
    }
    Ich habe das "max" mit "dist" ersetzt, da du es bereits definiert hattest.


    Und der Befehl müsste so aussehen:
    CMD:dclosestgift(playerid,params[])
    {
    new string[100];
    new i;
    if(sscanf(params, "i", i))
    {
    i = getClosestGift(playerid);
    if(i == -1) return SendClientMessage(playerid,-1,"Kein Geschenk in deiner Nähe!");
    }
    if(i < 0 || i >= sizeof(GiftBox)) return SendClientMessage(playerid,WHITE, "{FF1717}ERROR:{FFFFFF} Dieses Geschenk existiert nicht.");
    if(GiftBox[i][e_x] == 0.0 && GiftBox[i][e_y] == 0.0 && GiftBox[i][e_z] == 0.0) return SendClientMessage(playerid,WHITE, "{FF1717}ERROR:{FFFFFF} Dieses Geschenk existiert nicht.");


    DestroyDynamicObject(GiftBox[i][e_oID]);
    DestroyDynamic3DTextLabel (GiftBox[i][e_label] );
    format(string, sizeof(string), "{00FFFF}Giftbox {FFFF00}(%i) {FF0000}deleted.",i);
    SendClientMessage(playerid,WHITE, string);
    GiftBox[i][e_oID] = -1;


    new path[64];
    format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
    if(fexist(path)) fremove(path);


    GiftBox[i][e_x] = 0.0;
    GiftBox[i][e_y] = 0.0;
    GiftBox[i][e_z] = 0.0;
    return 1;
    }
    Dann wird, wenn du keine ID eingibst, die nächste ID genommen.

    Du meinst das hier?



    GiftBox[i][e_GiftID] = CreateDynamic3DTextLabel("ID: %i.",0xFF0000FF, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z]+1.10,8.0);



    Das zu:
    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);


    Außerdem müsstest du die Labels natürlich auch beim Delete-Befehl löschen, das darfst du nicht vergessen.

    Das alleine reicht allerdings für die korrekte Funktionalität nicht aus.


    Der Befehl muss so aussehen:
    CMD:deletegift(playerid,params[])
    {
    new i;
    if(sscanf(params, "i", i)) return SendClientMessage(playerid, 0xFF0000FF, "{FF1717}ERROR:{FFFFFF} /deletegift [ID]");
    if(i < 0 || i >= sizeof(GiftBox)) return SendClientMessage(playerid, 0xFF0000FF, "{FF1717}ERROR:{FFFFFF} Dieses Geschenk existiert nicht.");
    if(GiftBox[i][e_x] == 0.0 && GiftBox[i][e_y] == 0.0 && GiftBox[i][e_z] == 0.0) return SendClientMessage(playerid, 0xFF0000FF, "{FF1717}ERROR:{FFFFFF} Dieses Geschenk existiert nicht.");

    DestroyDynamicObject(GiftBox[i][e_oID]);
    GiftBox[i][e_oID] = -1;

    new path[64];
    format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
    if(fexist(path)) fremove(path);

    GiftBox[i][e_x] = 0.0;
    GiftBox[i][e_y] = 0.0;
    GiftBox[i][e_z] = 0.0;
    return 1;
    }


    Ansonsten können einige Fehler auftreten.

    Dann könntest du die Geschwindigkeit abfragen und überprüfen was LÄNGER gedrückt wurde.

    Das ist keine sichere Methode, denn man könnte ohne eine Taste gedrückt zu haben einen Berg herunter rollen, bzw man rollt auch noch weiter, wenn man hin und wieder den Pfeil zurück drückt.

    Ok, und wo hast du definiert, ob es eine Interior ID geben darf oder nicht?
    Oder ist es einfach nur: Es darf nur Interiors zwischen 1 und 20 geben?
    Das wäre dann:
    if(interior < 1 || interior > 20) return SendClientMessage(playerid, 0xFF0000FF, "Error: Nur Interiors zwischen 1 und 20 möglich.");

    Hier findest du die entsprechende Funktion dazu:
    http://forum.sa-mp.com/showthread.php?t=140183



    Wenn das false ist, fährt er vorwärts, ansonsten rückwärts.

    Das "_:" entfernt den Tag von hausEnum, in dem die Länge des enums steht.


    Einfügen musst du bei dem Unterstrich nichts. Das heißt nur, dass eine getaggte Variable ohne Tag ausgegeben wird.
    Kannst du dir vorstellen wie:
    new Text3D:label;
    label = Create3DTextLabel(...);
    printf("ID des Labels: %d", _:label)


    In deiner andere Funktion geht es vermeintlich, weil dein sizeof Wert kleiner oder gleich ist, als die Länge des enums. Wenn er kleiner ist, setzt es allerdings nicht alle Werte auf -1.
    In diesem Fall war er größer, so hat er das Array gesprengt.

    Das hört sich sehr nach Lag an, denn normalerweise wird das sofort aufgerufen.


    Wie ist es denn, wenn du außerhalb der Arena stirbst und neu spawnst? Also im ganz normalen Umfeld? Ist es da auch so?
    Ansonsten poste mal dein OnPlayerSpawn.