Beiträge von Madd92

    Initialisiert du das Array denn, bzw. setzt du den Wert noch irgendwo anders? Denn wenn nicht, wird es mit dem Wert 0 oder eben false initialisiert. Heißt, der Dialog wird dann nur angezeigt, wenn die Variable auch 0 ist, zum Beispiel wenn sie noch gar nicht gesetzt wurde.

    Wenn du die Variable auf 1 setzt, dann muss du natürlich abfragen ob die Variable 0 ist:

    C
    if(Spieler[playerid][pTaxiDuty] == false)


    Oder eben wie ich es geschrieben hatte:


    C
    if (Spieler[playerid][pTaxiDuty]) return true;
    C
    if(GetPlayerVehicleSeat(playerid) != 0)return SCM(playerid,SYSTEMGELB,"["TS"] Nicht der Fahrer des Fahrzeugs.");
    if (Spieler[playerid][pTaxiDuty]) return true;
    
    
    ShowPlayerDialog(playerid, DIALOG_TAXIPICE, DIALOG_STYLE_INPUT, "{FFFF00}Taxi - Preis festlegen", "{FFFFFF}Lege den Preis für die Taxifahrt fest:", "Ok", "Abbrechen");

    Im Prinzip so, aber das wird wie gesagt zu Problemen führen, wenn das Taxi nicht das gleiche ist z.B.

    Verwendest du OnPlayerStateChange und speicherst du, ob der Spieler im Dienst ist, bzw. die Fahrzeug-ID? Dann einfach bei if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER) und danach mit der Abfrage, ob das Fahrzeug ein Taxi ist, auch abfragen, ob der Spieler schon im Dienst ist. Gegebenenfalls auch noch prüfen, ob das Fahrzeug das selbe ist. Aber einfacher wäre es eben, den Dienst des Spielers zu beenden, wenn er aussteigt, so wie es bei mir der Fall ist.

    C
    else if (oldstate == PLAYER_STATE_DRIVER && newstate == PLAYER_STATE_ONFOOT) // Der Spieler verlässt als Fahrer ein Fahrzeug
        {
                    if (!GetPVarInt(playerid, "taxiid"))
                          return 1;
    		Delete3DTextLabel(GetPVarInt(playerid, "taxiid"));
                    // Dienstvariable auf 0 setzen?
    		SetPVarInt(playerid, "taxiid", 0);
    		return SendClientMessage(playerid, 0xFFFF00FF, "[TAXI] Du hast deinen Dienst beendet.");
        }

    Entweder beim Aussteigen aus dem Taxi den Dienst beenden oder wenn du das nicht willst, beim Einsteigen prüfen ob der Spieler im Dienst ist und den Dialog dann nicht anzeigen.

    Das einfachste wäre wahrscheinlich mit Gettime die Unix-Zeit zum Zeitpunkt des Banns auszulesen und gemeinsam mit der Banndauer in deiner Datenbank zu speichern. Wenn der Spieler sich dann einloggen will, prüfst du, ob der Zeitpunkt des Banns länger zurückliegt, als die Banndauer lang ist. Man sollte dabei allerdings z.B. auf Sommer-/Winterzeit achten. Wenn du Google bemühst, findest du zu "samp temp ban" einige Beispiele :)

    Du kannst mit {Left Anzahl} den Cursor an die gewünschte Position verschieben.
    Zum Beispiel {Left 30}.


    P.S. übrigens ist das hier der falsche Bereich für Autohotkey, dafür ist >> Coding << gedacht :)

    Da ich so etwas schonmal ausprobiert habe, poste ich das einfach mal. Ich bin allerdings kein Scripter und weiß, dass das Speichern der Text3D Variablen in PVarInts zu "tag mismatches" führt, aber für meine Zwecke (einfach zum Testen) war mir das egal und es ist einfacher und effizienter, das ganze so zu machen.



    Das mit den Dialogen kannst du aber im Prinzip genau so machen, den Rest kannst du ja anpassen.

    Auch da ist die Reihenfolge wieder völlig durcheinander, GetPlayerPos steht erst hinter IsPlayerInRangeOfPoint. Zumal wird strii für GetPlayerName und für die ClientMessage benutzt. Ein gut gemeinter Rat: lieber statt 1:1 kopieren, selber verstehen und umsetzen :)

    Ich persönlich habe mich nie mit der API beschäftigt. Dein Code ist einfach unsicher, jeder der den Keybinder hat, könnte sämtliche Daten aus der Datenbank auslesen. Daher bringt so ein Login-System auch nicht viel. Zudem speicherst du die Passwörter im Klartext. Ich würde also davon abraten, mit AHK zu versuchen ein Loginsystem zu erstellen.

    Du musst auf die Reihenfolge achten. Du liest den Spielernamen von pid aus, aber danach erst die pid selber mit sscanf.


    So würde ich es machen, man kann die String-Variablen wiederverwenden und die Reihenfolge ist so auch korrekt.

    Also dein Problem mit dem nur einen Zeichen wird sein, dass bei der For-Schleife begin und end für den Codeblock fehlen. Allerdings brauchst du keine zwei For-Schleifen, du kannst dir ja mal anschauen, was herauskommt:

    Code
    for k:=1 to length(edit2.text) do
    begin
      intstr:=Ord(edit1.text[i]);
      intkey:=Ord(edit2.text[k]);
      x:=(intstr+intkey) mod 26;
      ergebnis:=(x+Ord('A'));
      label1.caption:=label1.caption+upcase(chr(ergebnis));
    end;

    So funktioniert es für mich, auch wenn nicht besonders elegant gelöst: (schau es dir nur an, wenn du eine Lösung haben möchtest)