Beiträge von Mann im Mond

    Na ja irgendwie ist kein Code ein wenig durcheinander.
    1.) Vor "OnGameModeInit" gehört ein "public"
    2.) Befehle gehören nicht in "public OnGameModeInit" sondern in "public OnPlayerCommandText"
    3.) Hast du den #include wirklich ganz ganz oben?
    Am besten zeigst du mehr von deinem Code, da in dem kleinen Ausschnitt schon massenhaft Fehler sind

    Inwiefern? Als Einweisung in den Beruf? Falls ja, natürlich, müsstest halt anstatt der Variable "Tutorial" eine neue erstellen und mit der so umgehen wie mit Tutorial. Und dann bei dem Befehl mit dem man invitet wird noch die Kamera umsetzen/Spieler umsetzen/Variable wieder auf 0 usw.

    Aso ok dann benutze SetTimerEx
    Bei /earn:
    SetTimerEx("speeren",10000,false,"d",playerid);


    und dann änderst du das "speeren" in
    public speeren(playerid)
    {
    mission[playerid] = 0;
    return 1;
    }

    Dadurch würde aber jede Variable jedes Spielers betroffen sein, außerdem wissen wir immer noch nicht, ob die Variable überhaupt für Spieler ist oder für Autos oder für Bäume...

    Hä? Ich habe es extra gerade neu geschrieben, wenn du das meinst. Aber ich verstehe nicht, was daran Top sein soll. Eigentlich wollte ich kein neues schreiben, aber das in dem Link war tatsächlich fehlerhaft und kann nicht funktionieren, also musste ich es geringfügig umändern...

    Ich hab extra hingeschrieben, dass meins oben nur ein Beispiel war mit der "playerid". Zeig mal wie du mission erstellt hast, dann kann ich dir weiterhelfen.

    // oben
    new Tutorial[MAX_PLAYERS];
    forward Tutorial();


    // OnPlayerConnect
    Tutorial[playerid] = -1;


    // OnGameModeInit
    SetTimer("Tutorial",1000,1); // am Besten benutzt du einen breits bestehenden sekündlichen Timer


    // Das hier hinmachen, wo das Tutorial starten soll
    Tutorial[playerid] = 0;


    // Das hier hinmachen, wo das Tutorial enden soll
    Tutorial[playerid] = -1;


    // der neue Public


    public Tutorial()
    {
    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(Tutorial[i] > -1)
    {
    Tutorial[i]++;
    switch(Tutorial[i])
    {
    case 5:
    {
    // Nach 5 Sekunden wird das aufgerufen
    // hier kannst du dann SendClientMessage(i,FARBE,"Text"); machen
    }
    case 10:
    {
    // Nach 10 Sekunden wird das aufgerufen
    // hier kannst du dann SendClientMessage(i,FARBE,"Text"); machen
    }
    case 50:
    {
    // Nach 50 Sekunden kommt der letze Text
    // hier kannst du dann SendClientMessage(i,FARBE,"Text"); machen
    Tutorial[i] = -1;
    }
    }
    }
    }
    }
    }
    Es gibt noch viele andere Wege ein Tutorial umzusetzen, aber du benötigst immer einen Timer - ob er sich wiederholt oder nicht...


    Beim Compilen kommen nur dann Warnings (Fehler wegen "loose identitation" gibts ned), wenn du zu faul dazu bist deinen Code richtig einzurücken. Wenn du diese Fehler unterdrückst, kann kaum einer ohne große Anstrengung deinen Code entziffern. Lass das #pragma also weg und lern lieber wie man richtig einrückt.
    Also anstatt:
    if(x = y)
    {
    if(z = a)
    {
    if(a = b)
    {
    //Test2
    if(r = k)
    {
    //Test 5
    }
    }
    else
    {
    //Test
    }
    }
    }
    kann man es auch so schreiben:
    if(x = y)
    {
    if(z = a)
    {
    if(a = b)
    {
    //Test2
    if(r = k)
    {
    //Test 5
    }
    }
    else
    {
    //Test
    }
    }
    }
    Was kannst du besser lesen, wenn du was dran verändern möchtest?

    "array must be indexed bedeutet" du hast die Angaben (in den Klammern) hinter der Variable vergessen:
    Wie hast du mission erstellt? Wahrscheinlich mit
    new mission[MAX_PLAYERS]; //oder so ähnlich
    dann musst du in deinem Befehl auch
    mission[playerid] = 0;
    Ich weiß zwar nicht, für was die Variable gut ist, ob für Autos Spieler oder Sonstiges, aber mein Beispiel oben war eben auf eine Variable für die Spieler ausgelegt

    Ich kanns nur vermuten, da ich die Speicherung über MySQL vorziehe und noch nie mit dini gearbeitet hab, aber musst du als "filename" nicht nur den Dateinamen angeben oder kannst du dort auch eine Ordnerangabe mit reinmachen ("tuning")? Also ich denke es liegt daran, dass das Script die Datei nicht findet (wegen Pfadangabe oder falschere Ordner) und deshalb die Datei nicht löscht. Mach mal nach der Klammer von dini_exist eine Bestätigungsnachricht hin, die gesendet wird, um zu überprüfen, ob es an dem Problem liegt, was ich vermute.
    Also du musst dann kontrollieren ob die Nachricht gesendet wird oder nicht....

    Ehm, warum lässt du die wichtigesten Sachen aus meinem dir vorgeschlagenen Code weg. So wird es kaum funktionieren...
    Du musst doch die Variable (den Parameter) "fuel" definieren mit Hilfe von
    string = strtok(cmdtext,idx);
    string = strtok(cmdtext,idx);

    string = strtok(cmdtext,idx);
    if(string[0] == 0)
    {
    // Spieler hat keinen Parameter angegeben
    return 1;
    }
    fuel = strval(string);
    Außerdem solltest du noch ein paar SendClientMessage reinbauen zur Bestätigung

    Du kannst die Variable z.B. durch das
    new
    veh = GetPlayerVehicleID(playerid);
    bestimmen. Dadurch wird das Fahrzeug aufgetankt, in welchem der Spieler gerade sitzt.


    Zitat

    Nun muss ich noch beim Tank cmd haben, dass er pro Liter tankt :( , was meiner Meinung nach schwer ist. Wie geb ich an, dass er Pro Liter 1 € abzieht?
    Derzeit muss ich es leider noch so machen, dass er volltankt aber immer volltankt^^.

    Du musst einen Paramter benutzen, den der Spieler bestimmen muss, wie viel er tanken will.
    Mit dcmd und sscanf:
    dcmd_fuel(playerid,params[])
    {
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    {
    // Spieler ist kein Fahrer
    return 1;
    }
    new
    fuel,
    carid = GetPlayerVehicleID(playerid);
    if(sscanf(params,"d", fuel))
    {
    // Spieler hat keinen Parameter angegeben
    return 1;
    }
    if(Fuel[carid]+fuel > 100) // 100 ist die maximale Menge
    {
    // Es passt nicht so viel Sprit in das Auto
    return 1;
    }
    Fuel[carid] += fuel;
    GivePlayerMoney(playerid,-fuel); // Da 1 Liter $1 kostet
    //[... Meldungen usw ...]
    return 1:
    }
    Ohne:
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    {
    // Spieler ist kein Fahrer
    return 1;
    }
    new
    string[128],
    fuel,
    carid = GetPlayerVehicleID(playerid),
    idx;
    string = strtok(cmdtext,idx);
    if(string[0] == 0)
    {
    // Spieler hat keinen Parameter angegeben
    return 1;
    }
    fuel = strval(string);
    if(Fuel[carid]+fuel > 100) // 100 ist die maximale Menge
    {
    // Es passt nicht so viel Sprit in das Auto
    return 1;
    }
    Fuel[carid] += fuel;
    GivePlayerMoney(playerid,-fuel); // Da 1 Liter $1 kostet
    //[... Meldungen usw ...]
    return 1:

    dcmd bzw. sscanf ist kürzer bei Commands mit Parametern,doch bei Commands ohne Variablen erweist es umständlicher ;) .Nebenbei: Versteht man strtok, ist dies genau so einfach :|


    Es ging nicht um umständlicher sonderm um effektiver. dcmd ist umein Vielfaches effektiver als strcmp zu benutzen. Außerdem finde ich es sowohl mit oder ohne Variablen einfacher, da man nicht immer mit diesen strcmp rumhantieren muss. Für sscanf gilt das Gleiche: effektiver und einfacher zu nutzen und um später neue Paramter anzuhängen

    @ Kayer: Ich hab mit mal erlaubt deinen Code auszubessern:
    new
    name[MAX_PLAYER_NAME], //Welcher Name ist bitte 64 Zeichen lang? Keiner
    string[54];
    GetPlayerName(playerid, name, sizeof(name)); // Klammern nicht vergessen
    //new row; //Hä? Willst du einen switch auf ne neu erstellte Variable loslassen?
    switch(reason) // Bei OnPlayerDisconnect wird reason mitübergeben
    {
    case 0:
    {
    format(string, sizeof(string), " %s hat den Server verlassen. [Kick/Ban]", name);
    SendClientMessageToAll(COLOR_RED, string);
    }
    case 1:
    {
    format(string, sizeof(string), " %s hat den Server verlassen. [Verlassen]", name);
    SendClientMessageToAll(COLOR_RED, string);
    }
    case 2:
    {
    format(string, sizeof(string), " %s hat den Server verlassen. [Timeout]", name);
    SendClientMessageToAll(COLOR_RED, string);
    }
    }
    return 1;
    1.) Einrücken
    2.) Auf die Größe der Strings achten
    3.) Drauf achten, welche Variable du überprüfen musst
    4.) Auf Klammern achten