Beiträge von Mann im Mond

    Zuerst sollten die fahrzeuge erstellt werden mit ( CreateVehicle, AddStatic..), danach setzt man die Position der Fahrzeuge. (SetVehiclePos). Am besten geht das, wenn die fahrzeuge aus einer Dateiei geladen werden.


    Bei SetVehiclePos da wird die genau Postion gesetzt, also kommen die Fahrzeuge nicht von oben.

    Du weisst aber schon, dass SetVehiclePos nur für den Spieler funktioniert, der als letztes im Auto saß oder? Also kann deine Möglichkeit gar nicht für alle Spieler gelten...

    Autos Spawnen meist wild wenn eine bestimmte menge der Fahrzeuge erreicht wurde, eig. nen Typisches Problem,
    hab mal gehört soll daran liegen wenn viele Autos auf einem Fleck sind , in dem Sinne alle unmittelbar in gleicher nähe

    So konnte ich es auch beobachten. Die Fahrzeuge spawnen dann an falschen Stellen, wenn aufeinanderfolgende Autoids unmittelbar nebeneinander stehen, also wenn zb Autoid 1 direkt neben Autoid2 spawnt usw.

    Zitat

    Ah...hab mir den Code eben nochmal durchgelesen, allerdings ist es ja nun so, das wenn User A nun 3 Mal Enter tippt (ggf. er befindet sich in der Nähe eines Fahrzeuges), sofort gekillt wird.

    Eben nicht, deswegen hab ich ja PLAYER_STATE_DRIVER benutzt

    Zitat

    Dann gibts da noch einen winzig kleinen Fehler, der User bekommt diese CarJacks auch beim Einsteigen ohne Autojacking ;)

    Dann soll "gtatuerke" eben
    CarJacks[playerid] = 0;
    in einem public einbauen, der von einem bereits bestehenden Timer ausgeführt wird, um die Variable zurückzusetzen nach einer gewissen Zeit. Oder man schreibt ein anderes Script, das allerdings auch eine Schleife ausführt beim einsteigen, allerdings nur wenn wirklich jemand Enter drückt und einsteigt und nicht dauerhaft...
    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    if(!ispassanger)
    {
    if(!IsVehicleEmpty(vehicleid))
    {
    CarJacks[playerid]++;
    if(CarJacks[playerid] == CAR_JACKS)
    {
    SetPlayerHealth(playerid,0.0);
    CarJacks[playerid] = 0;
    }
    }
    }
    return 1;
    }


    stock IsVehicleEmpty(vehicleid)
    {
    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(IsPlayerInVehicle(i,vehicleid))
    {
    if(GetPlayerState(i) == PLAYER_STATE_DRIVER)
    {
    return false;
    }
    }
    }
    }
    return true;
    }

    Das gleiche was du erreichen willst. Du kannst den Code auch in "OnPlayerEnterVehicle" einfügen (allerdings wird das auch ausgeführt, wenn man nur Enter in der Nähe eines Fahrzeugs drückt, auch wenn man das Carjack abbricht), dann ist der Code genauso wie bei dir. Du müsstest eher dich fragen, was du damit erreichen wolltest. Ich habe bereits oben geschrieben, dass ich deinen Code lediglich umgeschrieben habe.


    EDIT: Habe dein Beitrag nich richtig gelsen. Die Variable wird hochgezählt und wenn man das Auto in meinem Fall 3 Mal "gejackt" hat, kriegt man Energieabzug und der Spass beginnt von vorn

    SIehst du denn die offensichtliche Klammerfehler nicht? Möglichweise liegt es darans, dass du nicht einrückst. Der letze Abschnitt muss so aussehen:
    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER)
    {
    CarJacks[playerid]++;
    if(CarJacks[playerid] == CAR_JACKS)
    {
    SetPlayerHealth(playerid, 0.0);
    CarJacks[playerid] = 0;
    } // Die hast vergessen
    } // Und die
    return 1;
    }

    Wie schon gesagt, alleine in deinem kleinen Codeausschnitt sind viele Fehler. Du kannst nicht einfach, zumindest in den meisten Fällen, fertige Scripte einfach so irgendwo in dein Script reinkopieren. Du musst schon drauf achten, dass du keine Klammernfehler machst, es an die richtige Stelle machst, abstimmst usw.
    Ich rate dir ein /showme selbst zu schreiben. Wenn du ein wenig scripten kannst, sollten dir folgende Tipps helfen:
    Du brauchst
    SetPlayerColor(playerid,FARBE); //Nimm ne sichtbare Farbe
    um deinen Spieler sichtbar zu machen auf der Map. Um es wieder rückgängig zu machen benutzt eine unsichtbare Farbe, welche du standartmäßig benutzt (allerdings mit entsprechendem Alpha Wert)

    Ohhhh, es funktioniert zwar arbeitet aber mehr als uneffektiv. Kannst du dir vorstellen, welcher Aufwand es für das Script ist 3 dauerhafte Timer auszuführen mit einer Schleife drin, die jeden Spieler überprüfen lassen und das dauerhaft? Den beinahme gleichen Effekt erziehlt man durch:
    //oben
    #define CAR_JACKS 3
    new CarJacks[MAX_PLAYERS];


    // in OnPlayerConnect
    CarJacks[playerid] = 0;


    // in OnPlayerStateChange


    if(newstate == PLAYER_STATE_DRIVER)
    {
    CarJacks[playerid]++;
    if(CarJacks[playerid] == CAR_JACKS)
    {
    // Was soll mit dem Spieler passieren?
    CarJacks[playerid] = 0;
    }


    }

    Musst du nicht, du kannst auch anstatt dem einmaligen auführen bei /login einfach das Tutorial ausführen lassen, wenn der Spieler einen Befehl eingibt, wie z.B. /tutorial. Du musst dann eben einfach in /tutorial
    Tutorial[playerid] = 0;
    einfügen

    Und noch etwas ressourcenschonender und ausführlicher:
    new str[75], name[16];
    GetPlayerName(playerid, name, sizeof(name));
    format(str, sizeof(str),"*** %s (ID: %d) ist von uns gegangen. ***", name);
    SendClientMessageToAll(0xFF0000FF, str);

    Wenn schon, dann eher:
    format(str, sizeof(str),"*** %s (ID: %d) ist von uns gegangen. ***", name, playerid);

    Nein wenn du zb das Tutorial durch einen Befehl starten willst, dann mach meinen Code innerhalb des Befehles.
    Da wo das Tutorials enden soll, benutzt du die andere Zeile, also in meinen Fall bei "case 50" - Nach 50 Sekunden endet das Tutorial.


    Wann soll das Tutorial starten? Nach dem allerersten Login? Dann machs innerhalb des Befehls /login, allerdings musst du darauf achten eine neue Variable zu erstellen, welche gespeichert wird, damit diese hochgezählt wird, wenn der Spieler es bereits angeschaut hat, ansonsten wird es bei jedem /login ausgeführt...

    Einrücken hilft, dann sieht man auch seine eigenen Klammerfehler:
    if(strcmp(cmdtext, "/tanken",true,5) == 0)
    {
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    {
    return 1;
    }
    new
    veh = GetPlayerVehicleID(playerid),
    fuel;
    if(PlayerToPoint(5.0, playerid, 1938.3669, -1773.0638, 13.3828))
    {
    string = strtok(cmdtext,idx);
    if(string[0] == 0)
    {
    // Spieler hat keinen Parameter angegeben
    return 1;
    }
    fuel = strval(string);
    if(Fuel[veh]+fuel > 100)
    {
    SendClientMessage(playerid, COLOR_ORANGE, "Du kannst nicht mehr so viel tanken ");
    return 1;
    }
    Fuel[veh] += fuel;
    GivePlayerMoney(playerid,-fuel);
    SendClientMessage(playerid, COLOR_ORANGE, "Du hast vollgetankt! ");
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED, "Du bist an keiner Tankstelle");
    }
    }

    Zitat

    array sizes do not match, or destination array is too small



    warum sagt er mir das hier

    Welche Zeile? Es heisst nur, dass du einen zu kleinen Array bestimmt hast...