Bei dem Command sSpieler[pid][Rang] = rang;
Beiträge von Madd92
-
-
Du trägst den Rang auch nirgendwo in das Array ein, soweit ich das sehe.
-
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.
-
-
Dann zeig nochmal, wo du das jetzt eingebaut hast.
-
Du setzt doch Spieler[playerid][pTaxiDuty] auf 1 wenn der Spieler in den Dienst geht?
-
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.
Celse 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.
C
Alles anzeigen#define DIALOG_TAXI_ENTER 1000 // eine noch nicht verwendete Dialog-ID stock isTaxi(vehicleid) { new model = GetVehicleModel(vehicleid); return model == 420 || model == 438; } public OnPlayerStateChange(playerid, newstate, oldstate) { if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER) // Der Spieler steigt als Fahrer ein { new vehicleid = GetPlayerVehicleID(playerid); if (isTaxi(vehicleid)) { SetPVarInt(playerid, "taxiid", vehicleid); return ShowPlayerDialog(playerid, DIALOG_TAXI_ENTER, DIALOG_STYLE_INPUT, "{FFFF00}Taxi - Preis festlegen", "{FFFFFF}Lege den Preis für die Taxifahrt fest:", "Ok", "Abbrechen"); } } 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")); SetPVarInt(playerid, "taxiid", 0); return SendClientMessage(playerid, 0xFFFF00FF, "[TAXI] Du hast deinen Dienst beendet."); } return 1; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch (dialogid) { case DIALOG_TAXI_ENTER: { if (!response) RemovePlayerFromVehicle(playerid); // Den Spieler aus dem Fahrzeug werfen, wenn er abbrechen drückt else { new taxifare = strval(inputtext); if (taxifare > 150 || taxifare < 50) // Ein maximales und minimales Limit für den Preis? { // Der Spieler kann es nochmal versuchen: ShowPlayerDialog(playerid, DIALOG_TAXI_ENTER, DIALOG_STYLE_INPUT, "{FFFF00}Taxi - Preis festlegen", "{FFFFFF}Lege den Preis für die Taxifahrt fest:", "Ok", "Abbrechen"); return SendClientMessage(playerid, 0xFF0000FF, "[TAXI] Der Preis muss zwischen 50 und 150$ liegen."); } SetPVarInt(playerid, "taxifare", taxifare); new String:labelstring[128]; format(labelstring, sizeof(labelstring), "=== [TAXI] ===\nPreis: %d$", taxifare); new Text3D:taxilabel = Create3DTextLabel(labelstring, 0xFFFF00FF, 0.0, 0.0, 0.0, 50.0, 0, 1); new vehicleid = GetPVarInt(playerid, "taxiid"); Attach3DTextLabelToVehicle(taxilabel, vehicleid, 0.0, GetVehicleModel(vehicleid) == 420 ? -0.4 : 0.0, 1.3); SetPVarInt(playerid, "taxiid", taxilabel); format(labelstring, sizeof(labelstring), "[TAXI] Du hast den Preis auf %d$ festgelegt.", taxifare); return SendClientMessage(playerid, 0xFFFF00FF, labelstring); } } default: { } } return 0; }
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.
PHP
Alles anzeigennew pid; new geld; if (sscanf(params, "ui", pid, geld)) return SendClientMessage(playerid, 0xFFFFFFFF, "Info: /pay (playerid) (summe)"); if (pid == INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xFFFFFFFF, "Der Spieler mit dieser ID ist nicht Online!"); if (pid == playerid) return SendClientMessage(playerid, 0xFFFFFFFF, "Du kannst dir nicht selbst Geld geben!"); new Float:x,Float:y,Float:z; GetPlayerPos(pid,x,y,z); if (!IsPlayerInRangeOfPoint(playerid, 2, x, y, z)) return SendClientMessage(playerid, 0xFFFFFFFF, "Dieser Spieler ist nicht in der Nähe!"); new message[256]; new name[MAX_PLAYER_NAME]; GetPlayerName(pid, name, sizeof(name)); format(message, sizeof(message), "Du hast %s %i$ gegeben!", name, geld); SendClientMessage(playerid, 0xFFFFFFFF, message); GetPlayerName(playerid, name, sizeof(name)); format(message, sizeof(message), "%s hat dir %i$ gegeben!", name, geld); SendClientMessage(pid, 0xFFFFFFFF, message); GivePlayerMoney(pid, geld); GivePlayerMoney(playerid, -geld); return 1;
So würde ich es machen, man kann die String-Variablen wiederverwenden und die Reihenfolge ist so auch korrekt.
-
Die Zeile ist nicht das Problem, du musst schon Kontext liefern.
-
Passiert das denn immer? Oder nur manchmal oder unter bestimmten Bedingungen?
-
Hmm also ich sehe keinen Fehler darin und bei mir funktioniert es auch. Veränderst du die aduty oder oldName Variablen noch irgendwo anders?
-
Siehe http://wiki.sa-mp.com/wiki/Kick. Du musst also einen Timer einbauen, nachdem die Nachricht gesendet wurde, welcher dann den Spieler kickt.
-
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:
Codefor 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)
Code
Alles anzeigenprocedure TForm1.Button1Click(Sender: TObject); var i,k,intstr,intkey,x,ergebnis:integer; begin label1.caption:=''; k := 1; for i:=1 to length(edit1.text) do begin intstr:=Ord(upcase(edit1.text[i])); intkey:=Ord(upcase(edit2.text[k])); x:=(intstr+intkey) mod 26; ergebnis:=(x+Ord('A')); label1.caption:=label1.caption+upcase(chr(ergebnis)); k:=(k+1); if (k > length(edit2.text)) then k:=1; end; end;