Beiträge von Mann im Mond

    Du musst dafür OnPlayerConnect die IP (mit der sich der Spieler ausgeloggt hat; diese speicherst du in der .ini oder in der Datenbank, je nachdem wie du speicherst) vergleichen mit der aktuellen IP, die der Spieler gerade hat. Dafür kannst du
    GetPlayerIP benutzen.
    Sollte die IP gleich sein, kannst du ganz normal die Daten laden ohne Passwortabfrage...


    Oktabius: das ist nicht das was er sucht, er sucht einen autologin ohne Passworteingabe, nicht ohne /login davor

    Return wurde oben schon erklärt. Du kannst damit zum einen bestimmte Vorgänge in deinen Script abbrechen:
    Wenn du z.B. return 1; innerhalb von "OnPlayerCommandText" verwendest, wird der restliche Code "unterhalb" deines returns nicht berücksichtigt
    // OnPlayerCommandText


    // Code wird berücksichtigt
    return 1;
    // Code wird nicht mehr berücksichtigt


    Außerdem kannst du mit Hilfe von return auch bestimmte strings (siehe oben beim Spielernamen ausgeben) oder bestimmte Werte ausgeben
    // Irgendwo in deinem Code


    if(IstSpielerConnected(playerid)) // andere Schreibweise "IstSpielerConnected(playerid) == 1)"
    {
    // Mach irgendwas
    }


    stock IstSpielerConnected(playerid)
    {
    // lang und ausführlich ausgeschrieben
    if(IsPlayerConnected(playerid))
    {
    return true; // Stimmt, falls playerid "connected" ist (true)
    }
    else
    {
    return false; // stimmt nicht
    }
    }
    Ist natürlich eine sinnlose Überprüfung, sollte aber nur zum veranschauen dienen. "IstSpielerConnected" gibt entweder 1 (true) oder 0 (false) aus, je nachdem ob der Spieler extistiert. Wenn eine 1 bzw. ein true ausgeben wird, ist die Bedinung in dem "if" oben erfüllt und er "// Macht irgendwas"


    Nein du musst Unterscheiden zwischen verschiedenen Variablentypen...
    ein Interger, wie dieser
    new zahl;
    kann alle Zahlen speichern unabhängig von ihrer Länge
    Ein Boolean, wie dieser
    new bool:zahl;
    kann nur true oder false abspeichern


    Das hat nichts mit der Länge zu tun.
    Wenn du
    [WERT]
    hintendranhängst, wird es zu einem Array.
    new array[3];
    kann zb speichern
    array[0] = 1;
    array[1] = 'B';
    array[2] = 3;

    Genau dann bekommst du nämlich das Model zurückgeliefert und nicht die Carid, denn
    carid != model


    Außerdem solltest du das letze else if(GANZ LANGE BEDINGUNG) für die Autos zu einem else machen
    Also
    else if(modelid == 400-405 || modelid == 407-408 || modelid == 410-416 || modelid == 418-424 ||
    modelid == 426-427 || modelid == 429 || modelid == 431-433 || modelid == 436-440 || modelid == 443-445 || modelid == 451 || modelid == 455-456 || modelid == 458-459 || modelid == 466-467 || modelid == 470-471 || modelid == 474-475 || modelid == 477-482 || modelid == 489-496 || modelid == 498-500 || modelid == 502-507 || modelid == 514-518 || modelid == 524 || modelid == 526-529
    || modelid == 531 || modelid == 533-536 || modelid == 540-544 || modelid == 546-547 || modelid == 549-552 || modelid == 545-562 || modelid == 564-568 || modelid == 573 || modelid == 575 || modelid == 576 || modelid == 578-582 || modelid == 585-589 || modelid == 596-605 || modelid == 609 )
    {


    zu
    else
    {

    1.) GetPlayerVehicleID(playerid); liefert die VehicleID deines Fahrzeugs zurück
    GetVehicleModel(GetPlayerVehicleID(playerid)); liefert das Model deines Fahrzeugs in dem du sitzt zurück
    Du musst also deine Zeile oben im Script entsprechend anpassen...
    2.) else if(modelid == 400-405)
    geht nicht, dazu müsstest du es so machen
    else if(modelid >= 400 && modelid<= 405)
    allerdings kannst du dein letzes "else if" (das viel zu lange) einfach zu einem "else" machen

    Du kannst dieaktuelle Zeit mit
    new
    Stunde,
    Minute,
    Sekunde;
    gettime(Stunde, Minute, Sekunde);
    bekommen
    Dann überprüfst du bei deinem /enter Befehl (oder wie er auch heissen mag, um eine Firma zu beteten, Sachen zu benutzen) diese aktuelle zeit mit dem gespeicherten Wert von deinen beiden oben genannten Befehlen
    if(Stunde < ÖFFNUNGSZEITMORGENS || Stunde > ÖFFNUNGSZEITABENDS) return SendClientMessage(playerid, FARBE, "Diese Firma hat geschlossen");

    Sampi, dein Code wird nicht funktioniert aus mehreren Gründen:
    1.) Du machst globale Floats, füllst diese aber an keiner Stelle mit einem Wert... Diese Floats sind außerdem total unnötig, da der Spieler im Himmel spawnt und nicht an der Stelle, wo er gestorben ist, so hat es zumindest alex geschrieben. Lokale Floats in OnPlayerDeath mit GetPlayerPos reichen...
    2.) Du solltest Arrays benutzen um die TimerID, die PickupID usw. des Spielers zu speichern, sonst funktioniert der Code für mehrere Spieler nicht
    3.) Du lässt zwar einen Timer ablaufen bei OnPlayerDeath, allerdings überprüft du bei OnPlayerSpawn nicht, ob der Spieler tatsächlich tot ist und setzt dort seine Position nicht auf die Position im Himmel, d.h. der Spieler spawnt gefreezt an seinem noirmalen Spawnplatz (nicht im Himmel), ein Pickup und Timer usw. wird aber erstellt. Nach einer gewissen Zeit wird er dann geportet durch den Timer
    4.) Du benutzt KillTimer in dem Callback, das aufgerufen wird, wenn der Timer SCHON abgelaufen ist
    5.) Du benutzt SetTimer, anstatt SetTimerEx, wo wir bei zombiemodder wären:


    zombiemodder, dein Code bewirkt, dass ALLE Spieler an den Koordinaten spawnwn, egal ob sie tot sind oder wie auch immer. Man müsste SetTimerEx verwenden und die playerid übergeben, wenn man schon SetTimer verwendet


    alex, bevor du gleich die nächste Frage stellst, solltest du erst einmal überprüfen ob der Code für mehrer Spieler funktioniert. Nicht einfach nur einfügen und gleich die nächste Frage stellen... Deine weitere Frage ist außerdem recht widersprüchlich mit dem ersten Post. Der Spieler soll im Himmel spawnen, aber trotzdem wiederbelebar sein?

    Zitat

    Editier bzw Push nicht ganze zeit :pinch:
    1. respawnzeit ändern, oben isn script


    Warum stellst du die Zeit auf eine solch hohe Zahl. Benutze "-1" als Respawnzeit und er spawnt niemals zurück, außer du zerstörst ihn natürlich


    zu 2.) Du überprüft mit Hilfe einer Schleife durch alle Autos, ob das Auto ein Polizeiauto ist und benutzt dann für dieses Auto
    SetVehicleToRespawn

    Versuch es, ich kann deinen Satz nicht nachvollziehen

    Zitat

    [...]wenn ich ein include mache, das abfrägt, ob der Spieler ein Admin ist[...]


    ein include frägt was ab?

    Ich habe die Erfahrung gemacht, dass dies Timeouts provoziert. Bei allen meinen gestestetn Sachen bin ich bei einem SetPlayerPos in einem OnPlayerDeath nicht immer, aber jedes 2. oder spätestens 3. mal gecrasht, auch bei einem "leeren" Script, es lag also nicht an dem Gamemode...
    Mir ist es persönlich egal, wo er es reinmacht, ich wollte ihn nur darauf hinweisen, allerdings frage ich mich, was es für einen Sinn macht gleich bei OnPlayerDeath (wird noch bei der "Todesanimation" aufgerufen) SetPlayerPos zu verwenden... ergibt für mich keinen Sinn

    mithilfe einer simplen if Abfrage, je nachdem wie du deine eams erstellt hast... in meinem Beispiel mit gTeam:
    if(gTeam[playerid] == TEAM_MEDIC)
    {
    // SetPlayerPos usw. - dein Teleport
    }
    else
    {
    // Nachricht senden? "Du bist kein Medic"...
    }

    Na ja fall ich mich nicht irre arbeitet CallRemoteFunction den umgekrehrten Weg, also von zb einem Filterscript zu einem Gamemode.
    Wäre also dein AntiCheat in deinem Gamemode könntest du vom Filterscript aus auf das Gamemode zugreifen, tum anderen Weg fällt mir grad keine Möglichkeit ein.


    Du könntest höchstens das Anticheat in deinen Gamemode einbauen...

    SetPlayerPos in OnPlayerDeath, würde ich nicht empfehlen. Dein
    kills[playerid]++;
    normal in OnPlayerDeath,
    deine Abfrage
    if(kills[playerid] == 3) // Warum > wenn man es in dieser Klammer wieder zurücksetzt? Ein == reicht dort
    {
    // SetPlayerPos ...
    kills[playerid] = 0;
    }
    in OnPlayerSpawn

    Zitat

    //ok ich habs getestet (endlich xD) und mir sind 2 sachen aufgefallen. wenn ich jemanden sein auto das erste mal jacke alles ok und das 2te mal werde ich gekickt und bekomme die 2te warnung aber es kommst auch die warnung vom 1x


    if(pCarJacked[playerid] == MAX_CARJACK)
    {
    // Nachricht 2 senden
    Kick(playerid);
    }
    else
    {
    // Nachricht 1 senden
    }


    Zitat

    und das 2te ich bin in mein auto wier eingestieen und bekam die 1ste warnung. oO


    Genauer, wann bist du wieder eingesteigen, nach dem Login? In das gleiche Auto und due bekamst ne warnung?

    zum Countdown:
    // oben
    new
    pCountdown[MAX_PLAYERS];


    // OnPlayerConnect
    pCountdown[playerid] = -1;


    // Befehl zum Starten
    pCountdown[playerid] = DEINE_ZEIT;


    // im Callback, der jede Sekunde ausgeführt wird
    if(pCountdown[playerid] > 0)
    {
    pCountdown[playerid]--;
    // Was soll passieren? Wenn du die zeit anzeigen lassen willst, formatiere eine string und
    // lasse pCountdown[playerid] anzeigen mit GameText oder SendClientMessage
    }
    if(pCountdown[playerid] == 0)
    {
    pCountdown[playerid] = -1; // Zurücksetzen
    // Was soll passieren? Countdown abgelaufen...
    }


    zum Waffenschein:
    Achso, dann musst du es für Level 3 Waffen so machen:
    if(Spieler[playerid][pWaffen] < 3) return SendClientMessage(playerid, FARBE, "Du brauchst mindestens einen Level 3 Waffenschein dafür");


    zum Essen
    Zeig mal deinen Code dazu, hast du das menu OnGameModeInit erstellt?

    Mach einfach beim ersten
    //Nachricht senden
    SendClientMessage(playerid, DEINE_FARBE, "Carjacken ist verboten");
    und beim z
    SendClientMessage(playerid, DEINE_FARBE, "Wir haben dich gewarnt");