Beim 1. hab ich beim Überfliegen keinen Fehler gefunden, aber Nummer 2 ist doch offensichtlich. Du nutzt eine For-Schleife, die überhaupt keinen Sinn hat. Du gehst alle Spieler durch, und wenn die aktuelle ID connected ist sperrst du den Spieler weg, den du mit der Funktion ausgewählt hast. Mach die Schleife weg und das if(IsPlayerConnected(i)) zu if(IsPlayerConnected(pID)). Außerdem musst du 2 Klammern wegmachen, da du einerseits mit der Rangeabfrage die Nachricht returnst und andererseits direkt mit dem Code darunter weitermachst.
Beiträge von Padarom
-
-
Alternativ geht auch ein #pragma unused strtok unter den Defines/Includes. Damit wird dem Script nur gesagt, dass strtok nicht genutzt wird und es wird vom Compiler ignoriert - Solltest du es später noch nutzen, kannst du einfach das Pragma ausklammern/Löschen.
Da du strtok aber nicht im Script hast, wie du es sagst, sollte dieses Warning (!) eigentlich nicht auftreten. Ansonsten kannst du es eigentlich eh getrost ignorieren, da Warnings das Kompilieren nicht abbrechen, das tun nur Errors.
Mit freundlichen Grüßen
Padarom -
2faches Danke
Hat geklappt, meinte eigentlich, dass ich es mit io_append schon ausprobiert hatte, dem war aber nicht so^^ -
Hallo zusammen,
ich bin gerade dabei in mein Anti-Scorehack-System eine Logfunktion einzubauen, welche jedes mal wenn ein Spieler Punkte bekommt dies im Log vermerkt. Dabei wird im Script überall nur dieses bestimmte Callback benutzt. Die Datei wird zwar erstellt und bleibt bestehen (bereits beim Login mit der fcreate(filename[])-Funktion aus der SAMP-Wiki), allerdings wird keine neue Zeile erstellt, sondern einfach die erste ersetzt, sodass stehts das neuste dasteht. Ich hoffe ihr findet das Problem.
stock SetPlayerScoreEx(playerid, score)
{
new Year, Month, Day, Hour, Minute, Second, Name[MAX_PLAYER_NAME], logtext[128], logtxt[256];
getdate(Year, Month, Day);
gettime(Hour, Minute, Second);
GetPlayerName(playerid,Name,MAX_PLAYER_NAME);
format(logtext,128,"/%s-Log.txt",Name);
new File:log = fopen(logtext, io_readwrite);
format(logtxt,128,"[%02d.%02d.][%02d:%02d:%02d]: %i Punkte\r\n",Day,Month,Hour,Minute,Second,score);
fwrite(log, logtxt);
fclose(log);
SetPVarInt(playerid,"points",score); // PVar für Anti-Scorehack - Wird bei Timer abgefragt und wenn Score anders ist: Kick/Ban
SetPlayerScore(playerid,score);
return 1;
}Mit freundlichen Grüßen
Padarom -
Bei Grex kriegst du für eine 10€ PSC 7,50€ auf Paypal
-
Ich glaube Steam checkt die IP des Nutzers und nicht den eingetragenen Standort - Sonst würde es ja auch nicht gehen wenn Grex es macht (Außer er ändert den Standort, was dann aber genauso unsinnig wäre, dann könnte er es ja auch einfach erklären wie). Hätte ich mal wieder eine 20€ PSC würde ich gerne mal auf eines deiner Angebote eingehen, ich find das echt klasse
Mit freundlichen Grüßen
Padarom -
Das Problem dabei ist, dass OnPlayerRequestClass erst aufgerufen wird, wenn man beim Skinselect einen Button drückt (einen Pfeil z.B.) - Hatte selber mal mit dem Problem zu kämpfen^^ Abhilfe schafft dann einfach ein Timer, der bei OnPlayerConnect ausgelöst wird und den Spieler nach einigen Sekunden (die man eben so braucht bis man im Skinselect ist) spawnt.
-
Bei OnPlayerConnect eine Abfrage
if(!IsPlayerNPC(playerid))
{
// Dein Zeugs zum Anzeigen der Nachricht, dass der Spieler beigetreten ist
} -
Also ich hab den ersten Teil mal gesehen und fand den jetzt nicht so der Hammer - Geschmäcker sind verschieden
-
Baue folgendes ein:
forward SendReset(playerid);
new bool:SendMessage[MAX_PLAYERS]=false ;
Die Abfrage if(health < 294) erweiterst du auf if(health<294 && SendMessage[i]==false) und setzt unter SendClientMessage den Bool auf true und startest den Timer SetTimerEx("SendReset", 3000, false, "i", playerid) und setzt bei der Funktion des Timeraufrufens den Bool des jeweiligen Spielers wieder auf False. So wird die Nachricht alle 3 Sekunden nur 1x angezeigt (andernfalls erweitere 3000 auf mehr).Mit freundlichen Grüßen
Padarom -
Meines Wissens nach gibt es keine Funktion, die das Passwort abruft. Was du jedoch machen könntest, wäre am Anfang des Scriptes unter OnGameModeInit das Passwort mit dem RCON Befehl "rcon_password [PASSWORD]" zu setzen und in einer Variable zu speichern, die du dann bei /rconpass ausgibst. RCON Funktionen findest du hier.
Mit freundlichen Grüßen
Padaromedit: Maddin war schneller, dafür hab ich aber noch den Link dazugepostet ;D
-
Ich glaube, dass ich das Problem jetzt gefunden habe.
Vor den Dialogen wird folgendes aufgerufen:
IsATC[playerid] = false;
atcbelegt[ATCPos[playerid]] = false;
ATCPos[playerid] = -1;
Die ATCPos des Spielers ist allerdings von Anfang an auf -1 definiert, und da atcbelegt ein Array ist, der mit 0 beginnt, hat er keinen -1 Wert, und irgendwas crasht, bzw. die Funktion wird beendet. Jetzt habe ich ATCPos auf 0 gesetzt und atcbelegt um eins erhöht, sodass überall im Script jetzt ein um 1 gesteigerter Wert genutzt wird. -
Bloody: Hätte ich jetzt überhaupt Filterscripts geladen
An die anderen: Danke, werde in Zukunft das \r weglassen, steht nur so auch in der Wiki deswegen habe ich es immer übernommen.
Findet trotzdem niemand den Ursprung des Problems? Die nachfolgenden Callbacks gehen inzwischen wieder, war deshalb vll nur ein Lag, wenn ich bei dem Callback etwas auswähle, kommt trotzdem keine Antwort.edit:
Scheinbar lag es an diesem Code:
IsATC[playerid] = false;
atcbelegt[ATCPos[playerid]] = false;
ATCPos[playerid] = -1;
Aber was ist daran falsch?
Vielleicht, dass ATCPos auf -1 gesetzt wird? Und wenn ja, wieso wird dann die Funktion beendet? -
Opa_Schlumpf: Ich schreibe einen Luftfahrtserver (der inzwischen schon fast fertig ist, siehe u.A. meine Signatur - Um keine Werbung zu machen *hust*), atcpos steht für Air Traffic Controller Position, kurz atcpos. \r\n ist ein Zeilenumbruch im Dialog oder allgemein in Pawn.
@BlackAce: Ich habe 30 Dialoge in meinem Script, die sind ALLE über #define name fortlaufende zahl definiert. keiner über new.
edit: Der Dialog ging ja vorher schon, allerdings hatte case 2 noch keine Funktion und deswegen hab ich den jetzt implementiert.
-
Hallo,
ich habe vor einigen Minuten einer meiner Dialoge erweitert (vorher war der case 2 zwar vorhanden, aber noch mit einem return 1; versehen), und seitdem reagiert der Dialog auf keine meiner Antwortmöglichkeiten mehr. Es ist zur Info ein DIALOG_STYLE_LIST mit drei Auswahlmöglichkeiten und folgendem Code. Nachdem ich die Änderung rückgängig gemacht habe, gab es noch das gleiche Problem. Andere Dialoge funktionieren, also liegt es wohl am Code.if(dialogid == changefrak && response)
{
new home[20];
GetPVarString(playerid,"heimat",home,20);
IsATC[playerid] = false;
atcbelegt[ATCPos[playerid]] = false;
ATCPos[playerid] = -1;
switch(listitem)
{
case 0:
{
if(!strcmp(home,"ls"))
{
SetPlayerPos(playerid,1887.5907,-2393.4739,13.5391);
SetPlayerFacingAngle(playerid,281.8907);
SetPlayerSkin(playerid, 61);
}
else if(!strcmp(home,"lv"))
{
SetPlayerPos(playerid,1595.2727,1448.6219,10.8282);
SetPlayerFacingAngle(playerid,86.6821);
SetPlayerSkin(playerid, 61);
}
else if(!strcmp(home,"sf"))
{
SetPlayerPos(playerid,-1264.0547,23.0747,14.1484);
SetPlayerFacingAngle(playerid,133.7686);
SetPlayerSkin(playerid, 61);
}
}
case 1:
{
if(!strcmp(home,"ls"))
{
SetPlayerPos(playerid,2019.4186,-2443.2949,13.5469);
SetPlayerFacingAngle(playerid,87.9982);
SetPlayerSkin(playerid, 16);
}
else if(!strcmp(home,"lv"))
{
SetPlayerPos(playerid,1318.7860,1256.9487,10.8203);
SetPlayerFacingAngle(playerid,0.8514);
SetPlayerSkin(playerid, 16);
}
else if(!strcmp(home,"sf"))
{
SetPlayerPos(playerid,-1225.8724,49.1484,14.1346);
SetPlayerFacingAngle(playerid,226.0345);
SetPlayerSkin(playerid, 16);
}
}
case 2:
{
ShowPlayerDialog(playerid, atcpos, DIALOG_STYLE_LIST, "Position auswählen.", "Tower\r\nDelivery","Auswählen","Abbrechen");
printf("%s: ATC selected.", playerid); // War zur Überprüfung ob der Case ausgelöst wird. Wird er nicht, die anderen aber auch nicht.
SendClientMessage(playerid, COLOR_LIMEGREEN, "ATC selected."); // Ebenfalls Überprüfung
}
}
return 1;
}
Ich hoffe ihr könnt den Fehler finden.mit freundlichen Grüßen
Padaromedit: Gerade geschaut ob die nachfolgenden Dialoge gehen. Tun sie leider nicht... Müsste also an dem Code hier liegen.
-
Du hast mit Sicherheit entweder irgendwo ein ~ zu wenig, oder der String (wenn der Textdraw über einen String formatiert wird) zu kurz ist.
Yo danke, ich hab den Tankinhalt so formatiert, dass er je nach Inhalt eine andere Farbe hat (weniger Inhalt: kritisch). Dabei habe ich statt ~w~ nur w~ gemacht. Bei Fahrzeugen mit weniger als 100 Inhalt wurde der Tank so nicht formatiert und deshalb hat es nicht gecrashed.
-
Hallo zusammen,
ich denke mal, dass das hier reingehört, da ich momentan einen recht großen- beliebig oft reproduzierbaren- Bug habe. Ich weiß jedoch nicht wo.
Ich habe mein Racescript von RaceCheckpoints auf normale Checkpoints umgeschrieben und dann geschaut, ob das ganze funktioniert. Nebenbei habe ich noch
eine Anzeige des Nummernschilds als Textdraw integriert (sodass folgendes als Textdraw auftaucht: Fahrzeugname, Geschwindigkeit, Motor an/aus, Tankinhalt & Zustand UND Nummernschild). Dies sollte eigentlich aus der .ini des Fahrzeuges (dynamisch gehalten) geladen werden.
Wenn ich nun ingame gehe und in ein Fahrzeug steige, so wird anfangs alles richtig dargestellt. Steige ich allerdings aus und wechsle das Fahrzeug, so werde ich entweder direkt auf den Desktop geschleudert, oder ich kann etwa 20 Sekunden fahren und bekomme dann einen Crash.
Das ist bei jedem Clienten der auf dem Server ist der Fall. Ich habe mehrfach überprüft, ob ich vielleicht ein nicht erstelltes Textdraw anzeige, oder ein solches ohne Inhalt, aber dem ist nicht so. Ich hoffe ihr könnt mir helfen.Code
Alles anzeigenSA-MP 0.3c-R3 Exception At Address: 0x00719176 Registers: EAX: 0xFFFFFF00 EBX: 0x0DAA2300 ECX: 0x0028FA68 EDX: 0x0000018C ESI: 0x0DAA2BE6 EDI: 0x0DAB2FFF EBP: 0x0DAA2351 ESP: 0x0028F9F8 EFLAGS: 0x00010297 Stack: +0000: 0x449D8000 0x00000000 0x00000000 0x00000000 +0010: 0x00000000 0x00000000 0x00000000 0x00000000 +0020: 0x00000000 0x0071A2C9 0x0DAA2BE6 0x0028FA68 +0030: 0x00000001 0x0028FA43 0x449D8000 0x44564924 +0040: 0x75B86C30 0x0DAA2351 0x67000000 0x413851EB +0050: 0x00000000 0x00000000 0x00000000 0x00000004 +0060: 0x44564924 0x413851EB 0x00000000 0x00E1E1E1 +0070: 0x00000000 0x00000000 0x00000000 0x00000000 +0080: 0x00000000 0x00000000 0x00000000 0x00000000 +0090: 0x00000000 0x00000000 0x00000000 0x00000000 +00A0: 0x00000000 0x00000000 0x00000000 0x00000000 +00B0: 0x00000000 0x00000000 0x00000000 0x00000000 +00C0: 0x00000000 0x00000000 0x00000000 0x00000000 +00D0: 0x00000000 0x00000000 0x00000000 0x00000000 +00E0: 0x00000000 0x00000000 0x00000000 0x00000000 +00F0: 0x00000000 0x00000000 0x00000000 0x00000000 +0100: 0x00000000 0x00000000 0x00000000 0x00000000 +0110: 0x00000000 0x00000000 0x00000000 0x00000000 +0120: 0x00000000 0x00000000 0x00000000 0x00000000 +0130: 0x00000000 0x00000000 0x00000000 0x00000000 +0140: 0x00000000 0x00000000 0x00000000 0x00000000 +0150: 0x00000000 0x00000000 0x00000000 0x00000000 +0160: 0x00000000 0x00000000 0x00000000 0x00000000 +0170: 0x00000000 0x0071A807 0x00000001 0x449D8000 +0180: 0x44564924 0x0DAA2351 0x0DAA2351 0x0DAA1F50 +0190: 0x00000000 0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF +01A0: 0xFFFFFFFF 0x03CA90A5 0x449D8000 0x44564924 +01B0: 0x0DAA2351 0x0DA80178 0x00000019 0x44A00000 +01C0: 0x3ACCCCCD 0x44800000 0x3B124925 0x03C26008 +01D0: 0x0000001A 0x00000000 0x03C9FCDD 0x007FB87A +01E0: 0x00000000 0x00000000 0x412D8106 0x0028FC58 +01F0: 0x00000B7C 0x717FBDC0 0x00000000 0x00000000 +0200: 0x006E8713 0x4537C000 0xBEC08000 0xC4D51604 +0210: 0x412D8106 0x0028FC58 0x00000A88 0x00000000 +0220: 0x452879FC 0x00C7DDF8 0x00000001 0x00000001 +0230: 0x00724D4F 0x00C7DE28 0x00C7DDF8 0x00725921 +0240: 0x44F5B942 0xC4E96C4F 0x4303B628 0x40000000 +0250: 0x00BA873E 0xF4A460FF 0x75B86C30 0x00000001 +0260: 0x0028FC7C 0x00000029 0x44F5B942 0xC4E96C4F +0270: 0x4303B628 0x452879FC 0xC4D51604 0x412D8106 SCM Op: 0x470, lDbg: 0 Game Version: US 1.0 State Information: Ped Context: 0
Mit freundlichen Grüßen
Padarom -
Noskill, das geht nicht. Die Rautetaste hat keine Keyzuweisung (http://wiki.sa-mp.com/wiki/GetPlayerKeys) und kann deshalb über diese Funktion nicht abgerufen werden. Meines Wissens nach
-
Mach mal mehrere Zeilen in den Code, dass man auch drübersehen kann. So kann man ja nicht wissen was wann gemacht wird.
Mit freundlichen Grüßen
Padarom -
Was genau willst du machen? Willst du, dass du Raute drückst und sich dann der Adminchat öffnet oder willst du anstatt/adminchat o.Ä. einfach # eingeben?
Für das zweite einfach if(strcmp(cmd, "#", true) == 0 )
Ich würde das if(IsPlayerConnected) übrigens rauslassen, da der Spieler einen Command eingibt ist er zwangsweise auch online.Mit freundlichen Grüßen
Padarom