Beiträge von Campbell

    Das funktioniert schon mit Timestamps. Oftmals verwende ich einen Sekunden-Timer im Script, der Dinge wie spielerspezifische Paydays (3600 Sekunden) etc. handhabt. Also:



    #pragma unused onSecondTimerHandle;


    new oneSecondTimerHandle,
    commandFailureTimestamp[MAX_PLAYERS] = {-1, ...};


    public OnGameModeInit() {
    oneSecondTimerHandle = SetTimer("oneSecondTimer", 1000, true);
    }


    forward oneSecondTimer();
    public oneSecondTimer() {
    if(commandFailureTimestamp[playerid] != -1 && gettime() - commandFailureTimestamp[playerid] >= 5) {
    PlayerTextDrawHide(playerid, noCmdBox[playerid]);
    PlayerTextDrawHide(playerid, noCmdText[playerid]);
    PlayerTextDrawHide(playerid, noCmdBad[playerid]);
    PlayerTextDrawHide(playerid, noCmdBefehl[playerid]);
    commandFailureTimestamp[playerid] = -1;
    }
    }


    public OnPlayerCommandPerformed(playerid,cmdtext[],success) {
    if(!success && commandFailureTimestamp[playerid] == -1) {
    PlayerTextDrawShow(playerid, noCmdBox[playerid]);
    PlayerTextDrawShow(playerid, noCmdText[playerid]);
    PlayerTextDrawShow(playerid, noCmdBad[playerid]);
    PlayerTextDrawShow(playerid, noCmdBefehl[playerid]);
    commandFailureTimestamp[playerid] = gettime();
    }


    return 1;
    }


    Deine Problemstellung ist irreführend, ich bin mir unsicher, ob ich dich richtig verstehe. Auf jedenfall kann ich dir sagen, dass das nichts mit return zu tun hat. Falls dich interessiert, was es mit return auf sich hat, dann schau dir mein Tutorial (siehe Signatur) an.

    • Weise jedem Haus eine eindeutige ID mithilfe von MySQL zu - Stichworte UNIQUE und AUTO_INCREMENT.
    • Weise diese ID den Gates zu. Die Gates sollten auch über IDs verfügen - so kann man einem Haus mehrere Gates oder einem Gate mehrere Häuser zuordnen.
    • Später hast du: 1x Haustabelle, 1x Gatestabelle, 1x Zuordnungstabelle
    • Diese Tabellen musst du nun nur noch ordentlich im Script verarbeiten.

    Ich denke, dass solch extra Zeilen in jedem Thread lästig sein könnten, warum nicht einfach so wie bei einer Registrierung/bei einem Kauf/... vorgehen?:

    • User wählt 'Thema erstellen' an.
    • Es tritt ein großer Kasten mit Checkbox und Submit-Button in Erscheinung, welcher die allgemeinen Kriterien für einen Post enthält.
    • Nur unter Ankreuzen der Checkbox wird es dem User möglich sein den Submit-Button zu drücken und zum Editor zu gelangen.
    • Dadurch, dass die allgemeinen Regeln für einen ordentlichen Post in der Box genannt wurden und vom User akzeptiert und registriert wurden, kann es sein, dass die User aufmerksamer posten & es wird den Moderatoren einfacher fallen Threads zu schließen bzw. in den Müll zu werfen.
    • Auch ist es möglich in die Box bereits ein Suchfeld mit einzubauen, damit die User nicht noch nach einem Suchfeld suchen müssen.


    Klar wird es beim Schließen von Themen bzw. beim Verwarnen von Usern immer Grenzfälle geben, aber so wird deutlich gemacht, dass die Regeln beachtet werden wollen. Man sollte meiner Meinung nach auch nicht immer direkt User verwarnen, sondern einfach Themen schließen mit einem Grund als Post darunter. Solch eine Box wird schwerer zu ignorieren sein als solch eine Zeile am Ende eines Threads.

    Indem du TextDraws erstellst und den String des TextDraws setzt. Dieses Thema wurde nun wirklich schon hunderte von Male bearbeitet, verwende die Suchfunktion oder Google und du wirst genügend Informationen finden.

    Um sich das Leben nicht unnötig schwer zu machen verwendet man dazu einen TextDraw Editor wie zum Beispiel:

    Das Geschriebene ist meist selbst nochmals ein TextDraw auf einem TextDraw oder ein einziger TextDraw mit einer Box um sich herum. Schaue dir einfach diese Editoren an, dann wird auch klar, wie TextDraws an sich funktionieren. Meist erklären die Editoren Schritt für Schritt, wie vorzugehen ist.


    P.S.: Beim Plural verwendet man kein Apostroph!

    Damit geht es eben am einfachsten, die Box sieht man ja nachher nicht mehr, da TextDrawUseBox() entfernt wird. Du kannst auch versuchen per Hand die Größe anzupassen - das wird aber höchstwahrscheinlich bei all diesen Tasten fehlschlagen.

    Das liegt an TextDrawTextSize(). Das ist die Fläche, über welche der Mauszeiger beim jeweiligen TextDraw fährt. Am besten passt du es so an:

    • Bei den TextDraws, die die Zahlen bilden, eine Box hinzufügen.
    • Die Größe der Box anpassen zur Fläche, die für das TextDraw gelten soll, d.h. die Größe der Fläche sollte die Fläche bilden, in welcher der Mauszeiger das TextDraw registriert/selected.
    • Abspeichern und in Script einfügen.
    • Bei all diesen TextDraws TextDrawUseBox() entfernen und TextDrawSetSelectable() hinzufügen.

    Das ist ein rießen Quellcode mit Funktionen, die wir nicht kennen. Daher solltest du einfach beginnen zu debuggen. Setze gezielt print()s und printf()s, sodass du siehst, wo es klemmt. Anschließend kannst du das Problem viel gezielter angehen.

    Du hast eben zwei Möglichkeiten (eine optimale Lösung kenne ich bisher noch nicht dafür):

    • OnUnoccupiedVehicleUpdate() - siehe oben. Wird jedoch alle paar Millisekunden aufgerufen. Performancetechnisch für die Tonne.
    • Beim "Abstellen" das Auto per CreateVehicle() oder anderer Funktion neu erstellen und respawn_delay setzen. Hier ist der Nachteil, dass das Auto eben auch visuell neu erstellt wird und sich u. U. die ID des Fahrzeugs ändert.


    Falsch. Maximal können 144 Zeichen ausgegeben werden.

    Das ist so nicht ganz korrekt. Es können lediglich 128 Zeichen ausgegeben werden, es werden jedoch nur 128 Zeichen von Nachrichten bis zu einer Länge von 144 ausgegeben. Von Strings länger als 144 Zeichen wird garnichts ausgegeben.


    Zu deinem Quellcode:

    • Überprüfe, ob der Spieler in der Schleife überhaupt verbunden ist oder besser: Verwende foreach!
    • Verwende strcat(), wenn immer möglich. Ist um einiges performanter als format und zum Beispiel für das Komma vor der Ausgabe besser geeignet.
    • Überprüfe am Ende, ob überhaupt ein Spieler im String steht - ansonsten gebe auch nichts aus oder eine Fehlermeldung.