/createrampe /deleterampe Aber wie?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo,


    ich brauche nen Befehl womit ich Rampen erstellen kann mit Befehl aber die auch nur temporär gespeichert werden also z.b. 10minuten...


    Das sollte so aussehen:


    /createrampe


    Dass dann da eine Rampe erstellt wird ist kein problem aber die sollte dann Rampe1 heißen. und wenn man den befehl nochmal eingibt soll eine Rampe mit dem Namen Rampe2 erstellt werden....


    Damit man später mit /deleterampe [Name] bzw Nummer eingeben kann und man sollte in der nähe von der rampe sein...


    Also man sollte die Rampen mit einem befehl einzeln entfernen können ..


    Bitte um dringende hilfe!



    @Jeffry

  • 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);
    }

  • Danke!


    aber ich habe params nicht definiert
    geht es auch mit


    if(strcmp(cmdtext, "/rampeweg", true) == 0)


    also speziell die reihe:



    if(sscanf(params, "d", i)) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /rampeweg [Slot]");


    Und wie kann man machen dass nach z.b. 10minuten jeweils die rampe verschwindet? also Rampe 1 setzen um 18:00 und verschwindet um 18:10
    und dass dann Rampe 2 um z.b. 18:02 gesetzt wird und um 18:12 verschwindet?


    (bzw ein timer für die rampen einzeln)?


    @Jeffry

  • Ich habe überall if(strcmp(cmdtext, "/rampeweg", true) == 0)


    Ist das ein Problem?


    Achja und man muss in der nähe der rampe sein um sie zu löschen..


    Beim bauen sollte auch ein abstand zwischen den rampen sein...

  • 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.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • @Jeffry



    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.");
    if(IsPlayerInRangeOfPoint(playerid, 6, RampeID[i])) return SendClientMessage(playerid, 0xFF0000FF, "Error: Die Rampe ist zu nah an einer anderen Rampe!");


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



    und einmal mit einem enum


    enum eRampe{
    Fload:RampeX.......


    bei new


    new RampeID[20][eRampe] = ....;


    aber dann kommt nen error dass eRampe nicht difiniert ist

  • Versuche es so:
    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.");

    for(new j = 0; j < sizeof(RampeID); j++)
    {
    if(RampeID[j] == -1) continue;
    GetObjectPos(RampeID[j], x, y, z);
    if(IsPlayerInRangeOfPoint(playerid, 6, x, y, z)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Die Rampe ist zu nah an einer anderen Rampe!");
    }

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

  • Beitrag von ElektroFreak ()

    Dieser Beitrag wurde vom Autor gelöscht ().
  • habe es jetzt auch beim entfernen befehl verucht aber wenn ich das so habe dann steht IMMER dass man nicht in der nähe ist und wenn ich die zeile mit dieser abfrage mal rausnehme dann wird immer nur objekt 0 entfernt egal welche zahl man schreibt.



    if(strcmp(cmdtext, "/entfernen", true, 10) == 0)
    {


    if(strlen(cmdtext) == 10) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /entfernen [ID]");
    else if(cmdtext[10] == ' ')
    {


    new i;
    for(new j = 0; j < sizeof(rampeID); j++)
    {
    if(rampeID[j] == -1) continue;
    GetObjectPos(rampeID[j], x, y, z);
    }


    if(i < 0 || i >= sizeof(rampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Es gibt nur Objekte von 1-20");


    if(rampeID[i] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Dieses Objekt existiert nicht!");


    if(!IsPlayerInRangeOfPoint(playerid, 4, x, y, z)) return SendClientMessage(playerid, 0xFF0000FF, "Du bist nicht in der Nähe des objects");



    DestroyObject(rampeID[i]);
    rampeID[i] = -1;
    rampeTime[i] = 0;


    new str[259];


    format(str, sizeof(str), "%d entfernt",i);
    SendClientMessage(playerid, 0xFF0000FF,str);




    }
    }


    @Jeffry

  • Versuche es so:
    if(strcmp(cmdtext, "/entfernen", true, 10) == 0)
    {
    if(strlen(cmdtext) == 10) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /entfernen [ID]");
    else if(cmdtext[10] == ' ')
    {
    new i = strval(cmdtext[11]);
    if(i < 0 || i >= sizeof(rampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Es gibt nur Objekte von 1-20");
    if(rampeID[i] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Dieses Objekt existiert nicht!");


    GetObjectPos(rampeID[i], x, y, z);
    if(!IsPlayerInRangeOfPoint(playerid, 4, x, y, z)) return SendClientMessage(playerid, 0xFF0000FF, "Du bist nicht in der Nähe des objects");


    DestroyObject(rampeID[i]);
    rampeID[i] = -1;
    rampeTime[i] = 0;


    new str[32];
    format(str, sizeof(str), "%d entfernt",i);
    SendClientMessage(playerid, 0xFF0000FF,str);
    return 1;
    }
    }

  • Beitrag von ElektroFreak ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: habs gelöst ().
  • Ok jetzt geht soweit alles aber habe nur den namen vom befehl "rampeweg" geändert und die zahlen dazu geändert aber wenn ich dann versuche die rampe zu entfernen steht im chat: SERVER:UNKOWN COMMAND



    vorher(geht)

    [list=1][*]if(strcmp(cmdtext, "/rampeweg", true, 9) == 0)
    [*]{
    [*] if(strlen(cmdtext) == 9) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /rampeweg [Slot]");
    [*] else if(cmdtext[9] == ' ')
    [/list]


    geht nicht
    [list=1][*]if(strcmp(cmdtext, "/lrampe", true, 7) == 0)
    [*]{
    [*] if(strlen(cmdtext) == 7) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /lrampe [Slot]");
    [*] else if(cmdtext[7] == ' ')
    [*]{
    [*]tmp = strtok(cmdtext, idx);
    [*]slot = strval(tmp);
    [/list]


    und dann halt die variable slot für die rampe bzw


    GetObjectPos(rampeID[slot], x ,y ,z);


    @Jeffry

  • if(strlen(cmdtext) == 9) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /rampeweg [Slot]");


    Das ergibt eh kein Sinn, wenn 9 Zeichen vorhanden sind soll die Meldungkommen /rampeweg Slot ?
    Und da fehlt doch was vom Befehl. Poste uns mal den ganzen Befehl hier rein.


    mfg


    Kannst statt cmdtext dort auch mit tmp und strtok arbeiten und statt if(strlen( was viel länger dauert einfach if(!tmp[0])reutrn bvlabla
    nehmen. Statt extra ne Funktion auszuführen um die Zeichen zu zählen.

    RFT