Beiträge von Mann im Mond

    Zitat

    1. Wie lass ich einen Timer abfragen ob er die und die zeit erreicht hat (z.B. ob der Timer gerade bei 30 sekunden ist!)


    Du meinst, dass du genau weisst, wie oft ein Sekunden Timer schon ausgeführt wurde? Dann lass einfach eine globale Variable hochzählen in dem Timer. Oder willst du irgendwas runterzälen lassen wie einen Countdown? Sag genauer für was du das genau brauchst...


    Zitat

    2. Mein Waffen menü funktioniert nicht richtig, eigentlich dürfte man nur ab dem Waffenschein lvl 1, lvl 1 Waffen kaufen!


    bei den Waffen bei Level 1 muss es dann so aussehen:
    if(Spieler[playerid][pWaffen] != 1) return SendClientMessage(playerid, FARBE, "Du brauchst einen Level 1 Waffenschein dafür");

    Zitat


    zum Essen:


    Dann musst du bei /essen ShowMenuForPlayer verwenden und das menu natürlich OnGameModeInit erstellen

    Dann musst du das "OnPlayerSpawn" regelen.

    public OnPlayerSpawn(playerid)
    {
    if(DmId[playerid] == 1)
    {
    //SetPlayerPos usw.
    }
    else if(DmId[playerid] == 2)
    {
    //SetPlayerPos usw.
    }
    else if(DmId[playerid] == 3)
    {
    //SetPlayerPos usw.
    }
    return 1;
    }

    Beim Tod oder Auloggen wird die Variable wieder zurückgesetzt, damit keine Fehler auftreten mit den Autos und Lete die sich ausloggen oder sterben
    #define MAX_CARJACK 2


    new
    bool:vDriver[MAX_VEHICLES],
    pOldCar[MAX_PLAYERS],
    pCarJacked[MAX_PLAYERS];
    public OnPlayerConnect(playerid)
    {
    pCarJacked[playerid] = 0;
    }


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER)
    {
    new
    carid = GetPlayerVehicleID(playerid);
    vDriver[carid] = true;
    pOldCar[playerid] = carid;
    }
    else if(oldstate == PLAYER_STATE_DRIVER)
    {
    vDriver[pOldCar[playerid]] = false;
    }
    return 1;
    }


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    if(!ispassenger)
    {
    if(vDriver[vehicleid])
    {
    // Nachricht senden?
    pCarJacked[playerid]++;
    if(pCarJacked[playerid] == MAX_CARJACK)
    {
    // Nachricht senden?
    Kick(playerid);
    }
    }
    }
    return 1;
    }


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
    if(vDriver[GetPlayerVehicleID(playerid)])
    {
    vDriver[GetPlayerVehicleID(playerid)] = false;
    }
    }


    }


    public OnPlayerDisconnect(playerid, reason)
    {
    if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
    if(vDriver[GetPlayerVehicleID(playerid)])
    {
    vDriver[GetPlayerVehicleID(playerid)] = false;
    }
    }


    }

    am Besten schaust du dir mal im Wiki die Funktionsbeschreibung von OnPlayerStateChange an. Es gibt sowohl newstate und oldstate. Die if Abfrage war
    else if(newstate == PLAYER_STATE_ONFOOT && oldstate == PLAYER_STATE_DRIVER)
    welche ing, ich aber trotzdem zu
    oldstate == PLAYER_STATE_DRIVER
    verbessert habe, da dies genauso ausreicht. Trotzdem würde die Erste Variante das selbe bewirken

    Meines funktioniert auch für mehr als einen carjack zur selben Zeit, von diesem Punkt aus gesehen also ja, ABER es handelt sich hierbei um einen Samp Bug. Wenn du "Enter" drückst zum Einsteigen und in dem Auto befindet sich jeder, fliegt dieser auf JEDEN Fall aus dem Auto, auch wenn du die Animation des herausiehens unterbrichst. Du könntest es alsonicht dazu verwenden, das Carjacken zu unterbrechen, du könntest den Spieler aber bei mehrmaligem Verstoss verwarnen oder kicken

    Surrender seines funktioniert nicht, da es eine eine variable für alle Spieler gleichzeit
    Oh da fällt mir ein, es gibt einen Samp Bug der es verhindert:
    Du kannst zwar den Spieler, der gerade vesucht einzusteuigen, davon abhalten, der andere Spieler steigt aber trotzdem aus, egal ob es abgebrochen wird oder nicht...

    Zitat

    Dann setz doch vDriver beim aussteigen auf False, himmeldonnerwetternochmal !
    /edit: BTW. nichtmals nötig, einfach das sinnlose


    Erst denken, dann schreiben, keinesfalls sinnlos, da PLAYER_STATE_ONFOOT auch aufgerufen wird, wenn ein Passagier aussteigt und das braucht man bei vDriver nicht. Der Fehler war ein Denkfehler von mir. Hier die überarbeitete Version:


    new
    bool:vDriver[MAX_VEHICLES],
    pOldCar[MAX_PLAYERS];


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER)
    {
    new
    carid = GetPlayerVehicleID(playerid);
    vDriver[carid] = true;
    pOldCar[playerid] = carid;
    }
    else if(oldstate == PLAYER_STATE_DRIVER)
    {
    vDriver[pOldCar[playerid]] = false;
    }
    return 1;
    }


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    if(!ispassenger)
    {
    if(vDriver[vehicleid])
    {
    SetPlayerHealth(playerid, 0); // Vorgang abbrechen
    }
    }
    return 1;
    }


    Fehler lag darin, dass bei ONFOOT kein Auto ausgebeben wird, sondern nur 0, logisch

    Oben steht der Code, den d dazu benutzen kannst. Wenn du wllst, dass der Spieler dabei sribt, dann benutze


    SetPlayerHealth(playerid, 0);


    anstatt


    TogglePlayerControllable(playerid, 1); // Vorgang abbrechen

    Benutze dafür SetPlayerColor in OnPlayerConnect (Farbe beim Connecten) und OnPlayerSpawn (Farbe je nach Fraktion)


    Das die Dreicke angezeigt werden, liegt in der Transparenz der Farben. Folgende farbe würde ein Dreieck hinterlassen auf der Karte, da sie nicht transparent ist
    #define FARBE 0xFF0000AA
    Um diese nicht transparent zu machen,musst du die Transparenz herunterstellen auf 0, dazu musst du die letzen beiden Werte "AA" in "00" umändern
    #define FARBE 0xFF000000


    00 bedeutet 0% Transparenz, 100% wären FF, also liegt der oben genannte Wert von AA bei vielleicht 60%-70% transparenz.

    Nicht einfach kopieren und einfügen, du solltest schon meinen Code in deinen einfügen.
    Beispiel:
    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    // hier dein bisheriger Code in OnPlayerenterVehicle (ohne return 1 !)
    if(!ispassenger)
    {
    if(vDriver[vehicleid])
    {
    TogglePlayerControllable(playerid, 1); // Vorgang abbrechen
    }
    }
    return 1;
    }

    Habe ich doch bereits:
    wenn deine Tankstelle die Koordinaten 1,2,3 hat und du willst dem Radius 6 um diesen Punkt tanken können, dann benutze
    if(PlayerToPoint(6, playerid, 1, 2, 3))
    {
    //hier dann dein Code, um den Tankvorgang zu starten, da de Spieler an der richtigen Position ist
    }
    else
    {
    //hier dein Code zum Geld abziehen, da der Spieler hier nicht tanken kann
    }

    new
    bool:vDriver[MAX_VEHICLES];

    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER)
    {
    vDriver[GetPlayerVehicleID(playerid)] = true;
    }
    else if(newstate == PLAYER_STATE_ONFOOT && oldstate == PLAYER_STATE_DRIVER)
    {
    vDriver[GetPlayerVehicleID(playerid)] = false;
    }
    return 1;
    }


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    if(!ispassenger)
    {
    if(vDriver[vehicleid])
    {
    TogglePlayerControllable(playerid, 1); // Vorgang abbrechen
    }
    }
    return 1;
    }
    ungetestet

    Zitat

    Wie kann ich Scripten das wenn man beim Tanken mehr als 3Meter von der Tankstelle weg bewegt kommt" Du bist zuweit von der Tankstelle weg... " Und dann wird der halbe tank preis abgezogen und der Tank vorgang abgebrochen.


    Benutze hierfür PlayerToPoint, damit überprüft du ob der Spieler an einer bestimmten Position ist
    if(PlayerToPoint(radius, playerid, x, y, z))
    {
    //Spieler ist an der Tankstelle
    }
    else
    {
    //Spieler ist wo anders
    }



    Zitat

    Wie kann ich einstellen das jede 30Min einmal automatisch lotto beginnt und 5min davor eine nachricht kommt In 5Min beginnt die lotterie benutze /lotto ZAHL um ein Lottoscheinzu kaufen.


    Mit einem sich wiederholenden Timer, der einen bestimmten Callback aufruft, in dem das Lotto gestartet wird


    Zitat

    //Edit: suksukgamer da kommt dieser Error


    ApplyAnimation(playerid,"KNIFE","KILL_Knife_Ped_Die",4.0,0,1,1,1,0);
    Damit das allerdings funktioniert, musst du SetPlayerHealth verzögern ausführen (SetTimerEx), da sonst die Animation nicht bis zum Ende abgespielt wird

    Zitat


    Wieder neue Frage: xD
    Wie grieg ich son "i" Pickup vor die LS bank zb?


    mit AddStaticPickup oder CreatePickup in OnGameModeInit


    Zitat

    Wie kann ich ein Rennen erstellen mit /checkpoint create und delete und deleteall und start


    Lad dir lieber erstmal im englischen samp Forum "yrace" runter, das macht das...

    Das wird nichts nützen. Innerhalb des Callbacks Sekundentimer wird eine playerid benötigt.
    Julian, warum stellst du dann einen Timer für alle? Hierfür ist SetTimerEx gedacht mit dem du dann auch eine playerid übergeben kannst.
    SetTimerEx("SekundenTimer", 1000, 1, "d", playerid);
    Was macht ihr eigentlich mit dem "CreateTextDraw"? Noch nie von der Funktion gehört, Wiki kennt das auch nicht...
    Mach dort lieber eine SendClientMessage oder einen GameModeText

    Um das zu machen erstellst /enter und /exit.
    Bei /enter überprüft du mit PlayerToPoint, ob der Spieler am Eingang steht und falls ja dann setzt du seine Position mit SetPlayerPos zu dem Punkt wo er hin soll.
    Bei /exit das gleiche, nur dass du noch eine Überprüfung reinmachst, ob es ein Cop ist, kommt darauf an wie du Cops definiert hast (mit gTeam?)

    Nein das wird so nicht gehen:
    1.) Dein forward und public sind nicht gleich
    2.) Du sendest eine Nachricht an alle nach dem Rcon befehl


    Man müsste bei /restart eine Nachricht senden und die Daten der Spieler sichern


    // bei /restart


    // Timer
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    //Daten sichern, Nachricht an den Spieler senden
    }
    }


    Und man müsste den public gleich nennen wie es beim forward und beim Timer steht


    public restartsaver()
    {
    //... Rcon Command
    }