Beiträge von Jeffry

    Versuche es so:
    Unter den Includes:
    new rampeID[20] = {-1,...}; //Maximal 20 Rampen
    new rampeTime[20];


    Unter OnGameModeInit:
    SetTimer("CheckRampen", 10000, true);


    Dann der Befehl zum Erstellen:
    if(strcmp(cmdtext, "/rampe", true) == 0)
    {
    new i, Float:x, Float:y, Float:z, Float:a;
    //Hier wird ein freier Slot (i) gesucht:
    for(i = 0; i < sizeof(rampeID); i++) if(rampeID[i] == -1) break;
    //Wenn keiner mehr frei ist:
    if(i == sizeof(rampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Es sind bereits alle Rampen-Slkots gefüllt, bitte lösche eine Rampe.");

    //Ansonsten erstelle das Objekt im Slot i.
    GetPlayerPos(playerid, x, y, z);
    GetPlayerFacingAngle(playerid, a);
    rampeID[i] = CreateObject(modelid, x, y, z, 0.0, 0.0, a); // >>> Bei modelid die Model-ID der Rampe eintragen. <<<
    rampeTime[i] = gettime() + 60 * 10; //10 Minuten
    new str[32];
    format(str, sizeof(str), "Rampe %d erstellt.", i);
    return SendClientMessage(playerid, 0xFFFFFFFF, str);
    }


    Und den Befehl zum Löschen:
    if(strcmp(cmdtext, "/rampeweg", true, 9) == 0)
    {
    if(strlen(cmdtext) == 9) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /rampeweg [Slot]");
    else if(cmdtext[9] == ' ')
    {
    new i;
    if(sscanf(cmdtext[10], "d", i)) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /rampeweg [Slot]");
    if(i < 0 || i >= sizeof(rampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Dieser Slot existiert nicht.");
    if(rampeID[i] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Dieser Slot ist nicht belegt.");
    DestroyObject(rampeID[i]);
    rampeID[i] = -1;
    rampeTime[i] = 0;
    new str[32];
    format(str, sizeof(str), "Rampe %d gelöscht.", i);
    return SendClientMessage(playerid, 0xFFFFFFFF, str);
    }
    }


    Und der Timer:
    forward CheckRampen();
    public CheckRampen()
    {
    for(new i = 0; i < sizeof(rampeID); i++)
    {
    if(rampeTime[i] != 0 && gettime() > rampeTime[i])
    {
    DestroyObject(rampeID[i]);
    rampeID[i] = -1;
    rampeTime[i] = 0;
    }
    }
    return 1;
    }


    Probiere das mit den Abständen bitte selbst zu realisieren, wenn ich dir das ganze System schreibe lernst du ja nichts dabei.
    Versuche es mal selbst, falls du nicht weiter kommst, poste bitte den Stand des Befehls, bei dem du nicht weiter kommst.
    Teste aber erst mal, ob es so funktioniert.

    Ok, dann kannst du ja den alten Thread löschen, um Verwirrungen zu vermeiden.


    Zu deiner Frage, das kannst du dann ganz einfach so machen:
    Unter den Includes:
    new rampeID[20] = {-1,...}; //Maximal 20 Rampen


    Dann der Befehl zum Erstellen:
    ocmd:rampe(playerid)
    {
    new i, Float:x, Float:y, Float:z, Float:a;
    //Hier wird ein freier Slot (i) gesucht:
    for(i = 0; i < sizeof(rampeID); i++) if(rampeID[i] == -1) break;
    //Wenn keiner mehr frei ist:
    if(i == sizeof(rampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Es sind bereits alle Rampen-Slkots gefüllt, bitte lösche eine Rampe.");

    //Ansonsten erstelle das Objekt im Slot i.
    GetPlayerPos(playerid, x, y, z);
    GetPlayerFacingAngle(playerid, a);
    rampeID[i] = CreateObject(modelid, x, y, z, 0.0, 0.0, a); // >>> Bei modelid die Model-ID der Rampe eintragen. <<<
    new str[32];
    format(str, sizeof(str), "Rampe %d erstellt.", i);
    return SendClientMessage(playerid, 0xFFFFFFFF, str);
    }


    Und den Befehl zum Löschen:
    ocmd:rampeweg(playerid, params[])
    {
    new i;
    if(sscanf(params, "d", i)) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /rampeweg [Slot]");
    if(i < 0 || i >= sizeof(rampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Dieser Slot existiert nicht.");
    if(rampeID[i] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Dieser Slot ist nicht belegt.");
    DestroyObject(rampeID[i]);
    rampeID[i] = -1;
    new str[32];
    format(str, sizeof(str), "Rampe %d gelöscht.", i);
    return SendClientMessage(playerid, 0xFFFFFFFF, str);
    }

    Auf Krampf komm raus funktioniert es nun.

    Lass die Schleife weg und mache es lieber so, das ist besser, und du kannst das Array nicht sprengen:
    if(obj2 >= 0 && obj2 < 3 && Objjs[playerid][slotti][obj2] != 0)
    {
    DestroyObject(Objjs[playerid][slotti][obj2]);
    }


    Jedoch, wie muss ich den Public nun aufbauen ?

    Mit einer Schleife durch den Cache.
    Gleich wie hier beim Laden der Fahrzeuge: [jTuT] Fraktions-Fahrzeug-System mit MySQL R39-2
    Versuche mal, ob du damit so klar kommst.

    Siehst du diese Nachricht noch?
    SendClientMessage(playerid,ROT,"Du kannst jetze das Weizen ernten!");


    Wenn ja, dann füge danach das hier ein:
    SetTimerEx("farmtimer",1500,false,"i",playerid);


    Es scheint mir nämlich so, dass da der Timer nicht mehr gestartet wird, wenn du mit dem sähen fertig bist.

    Dann könnt ihr ja mal versuchen, wie angesprochen, Stück für Stück Teile aus OnPlayerDeath auszukommentieren, also nicht nur das ganze Callback, sondern Teile davon, so lange, bis ihr die Zeile(n) gefunden habt, die den Spieler so langsam sterben lässt/lassen.


    Dass der Spieler nicht im Krankenhaus landet hat mit OnPlayerSpawn zu tun, da dürfte dort was nicht passen.

    Es sind 785 Objekte geladen. Standardmäßig lädt der Streamer, soweit ich weiß, die nächsten 800 Objekte, sprich du bist da schon ziemlich nahe dran.
    Das könnte erklären, warum die Objekte so spät angezeigt werden.

    Ja, das kannst du dann genau so machen.
    Nochmal zur Erläuterung:
    Objjs[playerid][slotti][i]
    Heißt dann:
    Objjs[playerid][slotti][0] hat den Wert 81.
    Objjs[playerid][slotti][1] hat den Wert 82.
    Objjs[playerid][slotti][2] hat den Wert 83.


    Willst du nun Slot 0 löschen, dann löschst du das Objekt: Objjs[playerid][slotti][0]
    Damit wird Slot 0 gelöscht und das Objekt mit der ID 81 entfernt.

    Jetzt verwirsst du mich auch so langsam. :S Du willst einen freien Slot (i) suchen?
    Das wäre dann so:
    for(new i = 0; i < 3; i++)
    {
    if(Objjs[playerid][slotti][i] == 0)
    {
    Objjs[playerid][slotti][i] = CreateObject(obj2, x, y, z,0.0,0.0,0.0,0.0);
    break; //Um die Schleife zu stoppen.
    }
    }
    Das kann aber sein, dass du das schon hast, ich weiß nicht wie du i definiert hast, ob das schon die Schleife ist, eben vor dem sscanf.
    In dem Falle wäre das korrekt.


    Slot 0 (i) hat dann den Wert (Objekt ID) 81.


    Besser wäre es allerdings, die drei Objjs[playerid][slotti][i] mit -1 zu instanziieren, bei OnGameModeInit, und in der Schleife auf -1 zu prüfen, da es eine Objekt ID 0 geben kann, die du dann nicht mehr löschen könntest, sofern sie mit diesem Befehl erstellt würde.

    @YaBroo
    Das hier gibt dir 81 aus?
    Objjs[playerid][slotti][i]
    Das wäre korrekt, da CreateObject dann die 81 zurück gegeben hat.
    Den Wert von i kann ich diesem Code nicht entnehmen.



    @malE
    Das heißt, dass du irgendwo versuchst einen Cache auszulesen, obwohl es keinen gibt.
    Inwiefern das Probleme verursacht kann man nicht sagen, ohne zu wissen, welcher Code das verursacht. Als Beispiel könnte es sein, dass der Spieler beim Login kein Geld bekommt (Beispiel!). Du willst eben irgendwo was laden, wo nichts existiert.
    Das wirst du nur durch suchen oder debuggen (prints) herausfinden können, wo das ist.