Ändere mal in der Datenbank float zu double ![]()
Beiträge von Kaliber
-
-
Kannst du uns die Tabellenstruktur zeigen in Mysql?

#Handy
-
jedoch wird leider nichts in der DB gespeichert
Dafür empfiehlt es sich den mysql_log auf DEBUG zu setzen unter OnGameModeInit und anschließend den mysql.log mal anzuschauen

Kannst ihn gerne auch hier posten.
-
Du darfst dich von der Bezeichnung von Variablen nicht verwirren lassen

Es spielt in diesem Beispiel ja gar keine Rolle, wie du die Variable bezeichnest, alle besitzen den selben Wert von x und zwar 5.
Das mit dem pID wird nur oft gemacht, damit man in diesem Kontext weiß, dass die Variable den Wert von einer anderen Spielerid enthält.
Aber in diesem Fall erstellst du ja das Fahrzeug für playerid. Also brauchst du keine weitere Variable.
Wie du es zuvor gelöst hattest mit dem pID, da war der Wert immer auf 0, das hätte ja so oder so nicht funktioniert. Irgendwo muss der Wert für den Spieler ja herkommen

-
3x number of arguments does not match definition
Du rufst folgendes auf:
createPlayerCar(pID,vehid,color[0],color[1], Pos[0], Pos[1], Pos[2], Pos[3], -1);
definiert ist es aber:
createPlayerCar(playerid, modelid, Float:x,Float:y,Float:z,Float:r)
Wie du siehst, hast du color[0], color[1] und die -1 am Ende gar nicht in der Funktion oben angegeben.
C
Alles anzeigencreatePlayerCar(playerid, modelid, c1,c2, Float:x,Float:y,Float:z,Float:r, respawn=-1) { for(new i=0; i <sizeof(carInfo); i++) { if(carInfo[i][id_x] !=0)continue; format(carInfo[i][besitzer], MAX_PLAYER_NAME,"%s",SpielerName(playerid)); carInfo[i][c_x] = x; carInfo[i][c_y] = y; carInfo[i][c_z] = z; carInfo[i][c_r] = r; carInfo[i][c_x] = x; carInfo[i][car_farbe] = c1; carInfo[i][car_farbe2] = c2; carInfo[i][model] = modelid; carInfo[i][id_x] = CreateVehicle(modelid,x,y,z,r,c1,c2,respawn); new string[128]; format(string,sizeof(string),"[ {FF3E00}AdminCMD{FFFFFF} ]: Du hast ein Fahrzeug für %s mit der (ID: %i) erstellt!",SpielerName(pID), i); SCM(playerid,WEISS,string); saveCarToDB(i); return 1; } return 1; }Sieht dann so aus.
Das respawn=-1 in der Parameterliste oben sorgt btw dafür, dass der default wert von der Respawn-Zeit bei -1 liegt.
Sprich du könntest es auch nur so aufrufen:
createPlayerCar(pID,vehid,color[0],color[1], Pos[0], Pos[1], Pos[2], Pos[3]);
und es würde funktionieren (da -1 default gesetzt wird)

-
Okay keine Ahnung irgendwas blockiert bei dir die Weitergabe der cmds an das Plugin.
Dann musst du halt ocmd und Lösung 2 verwenden...
Aber das ultra merkwürdig...kp was für Code du da sonst noch so nutzt..
-
Hmmm debugging wäre jetzt interessant...
füge das mal deinem Skript hinzu und gib nochmal einen Befehl ein:
Code
Alles anzeigenpublic OnPlayerCommandReceived(playerid, cmd[], params[], flags) { printf("%s|%d",cmd,flags); //Und dann schau mal im server log, ob das ausgegeben wird return 1; } public PC_OnInit() { print("CMD Plugin loaded!"); return 1; }Wenn nichts im Server Log steht, wird das Plugin bei dir nicht richtig geladen...
-
Und es passiert einfach nichts?!
Kann ich mir nicht erklären...noch nie erlebt.
Also du hast mehrere Befehle ausprobiert und keiner klappt mehr?
Und du bist sicher, dass du kein OnPlayerCommandText mehr nutzt...und keine andere CMD Prozessoren, wie ycmd, ocmd, zcmd...o.ä.?
Was für Includes nutzt du denn alles?
-
//Edit:
Achso ja, du musst noch einen Befehl eingeben und dann den Log zeigen xDAber bisher sieht alles unauffällig aus, sehr komisch...
-
Einfach den normalen server log, da werden die mit reingeschrieben

-
Nutze mal crashdetect und könntest du den server.log hier zeigen?
Kann mir sonst keinen Reim auf die Sache machen.
-
Und du hast es kompiliert, die amx am Server getauscht und neu gestartet und es funktioniert weiterhin kein Befehl?!
-
Du benötigst den Callback OnPlayerCommandText gar nicht mehr. Lösche diesen am Besten.
Und nutze nur:
Cpublic OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags) { if (result == -1) { SCM(playerid, 0xFFFFFFFF, "SERVER: Befehl nicht gefunden."); return 0; } return 1; }Und du bist sicher, dass du oben im Skript #include <ocmd> quasi rausgeschmissen hast und nur #include <Pawn.CMD> verwendest?
-
Was sagt denn der server log? Wurde das Plugin geladen?
-
ich glaub Lösung 1 hat mir gerade das gesamte script "zerschossen" Login System fehlt etc. kein Befehl funktioniert
Dann check mal den Server Log...
Wurde das Plugin überhaupt geladen? Musst es in den Plugin Order packen und die Server.cfg anpassen...
-
Jedoch frag ich mich immer noch wieso sobald ich beim accept Befehl InGame /accept eingebe sofort die einladung angenommen wird!? weil wie gesagt gibt ja noch weitere dinge die man accepten kann bspw. /accept dice etc.
Ah, ja stimmt ich habe nicht bedacht, dass ocmd ja gar nicht \0 in den String packt sondern \1...
Lösung 1:
Ich empfehle dir nutze nicht ocmd, sondern: https://github.com/katursis/Pawn.CMD/releases
Das ist deutlich schneller und weniger Fehleranfällig

Kannst oben dann in Pawno einfach Ersetzen machen und ocmd: durch CMD: oder cmd: ersetzen

Oder Lösung 2:
-
Also wäre es zum Vorteil dies auch bei meinem accept Befehl umzuändern? von quasi so:
Das kommt darauf an...
In diesem Fall funktioniert es, da keine Weiteren Parameter außer dem Keyword eingegeben werden. Aber falls doch, solltest du das so machen.
//Und hier dann immer die nächsten keyword hinter invite einfügen?
Joaa, ansonsten weiß der Nutzer ja nicht, welche Optionen er alle hat

Und anstatt dem return 1 unten würde ich nochmal wie oben erklärt SCM(playerid, WEISS, info); nutzen, damit er direkt weiß, welche keywords es gibt.
Nur als Info noch:
Cif(!strcmp(item, "invite",false)) // Das sorgt dafür, dass nur "invite" geschrieben werden kann. Es wird quasi geprüft, ob die Groß- und Kleinschreibung richtig ist. Für den Nutzer ist das oft nervig, da es ja egal ist, ob er Invite oder invite, invitE schreibt, ist ja alles das Selbe und es soll funktionieren if(!strcmp(item, "invite")) //<< das sorgt dafür, dass die Groß-und Kleinschreibung ignoriert wird und alles gültig ist ;)jedoch wird mein Fraktionsrang in der DB auf 70 gesetzt wie kann das zustande kommen?
Kann ich dir so nicht sagen, vllt geht etwas beim Speichern schief?
Dazu müsste ich dein Speichersystem begutachten.
SetPVarInt(playerid, "getfrak", 0);
Noch ein Hinweis dazu, lösche das ruhig einfach:
DeletePVar(playerid, "getfrak");
Dann sinkt der RAM Verbrauch vom Server

-
Genau dieses System wird ironischer Weise schon als Standard-Beispiel für den Callback selbst angegeben: https://team.sa-mp.com/wiki/OnPlayerDeath_DE.html
Hoffe das hilft dir weiter

-
Also zuerst zu der Info Variable:
Gibt der User nur /erstellen ein, soll er ja eine Nachricht erhalten mit den möglichen Parametern. Aber gibt er jetzt z.B. instinktiv /erstellen Car ein, dann würde ja nichts passieren, da das Keyword "Car" nicht gefunden werden würde. Dachte es wäre eine nette Geste einfach dann nochmal die Info auszugeben, was mögliche Keywords sind, einfach dass man weiß, dass man ein ungültiges Keyword eingegeben hat.
Damit du jetzt aber nicht immer oben und unten die Liste erweitern musst, wenn neue Keywords wie keine Ahnung /erstellen [Auto, Objekt] oder sonst was, gibt es quasi diese Konstante, die nur einmal verändert werden muss und dann wird die Info oben und unten angepasst

Als Programmier sollte man immer Redundanzen vermeiden. Sprich wenn du z.B. mehrfach den selben Text verwendest, leg eine Konstante an und verwende ihn quasi nur einmal.
Es hat hier sogar einen Vorteil eine Konstante, statt eines Makros (#define) zu verwenden. Beim define wird während des Kompiliervorgangs ja das Makro ersetzt. Sprich:
C//Vor dem Kompiliervorgang #define TEST_INFO "Das ist ein Test" print(TEST_INFO); print(TEST_INFO); //Danach: print("Das ist ein Test"); print("Das ist ein Test");Jetzt muss trotzdem 2x Speicher für den Text reserviert werden. Hätte man hingegen folgendes getan:
Würde nur 1x Speicher reserviert werden und es würde immer auf diesen Speicherbereich zugegriffen werden

Aber das sind nur so mini Optimierungen
Primär geht es auch darum, dass du so weniger Rechtschreibfehler machst und alles gleich formuliert ist und somit schön konsistent und professionell wirkt.Zudem, wenn eine Änderung gemacht werden muss, du nur einen Punkt anpassen musst.
Zu dem Code:
Dein Code hat nicht funktioniert, da sscanf quasi nur einen Parameter oben erwartet hat und nicht mehrere. Also ist es besser das hier manuell zu machen.
Du willst ja aus dem Befehl den ersten Parameter haben.
Gibt man /erstellen Auto 1 1 1 z.B. ein, dann steht in params[] "Auto 1 1 1".
Nun wollen wir ja nur das "Auto" haben.
strfind sucht nun nach dem Leerzeichen (und gibt die Position im String zurück, an welcher Stelle es gefunden wurde).
Nun können wir den String splitten, indem wir von Position 0 - zum Position des Leerzeichens den Inhalt kopieren. Das ist nämlich genau unser gewünschtes Keyword.
Existiert kein Leerzeichen, nehmen wir die gesamte Länge des Strings, das wird mit dem Ternary Operator ? : geprüft.
Dient im Endeffekt nur dazu das erste Wort zu bekommen

-
Probiers mal so:
C
Alles anzeigenocmd:erstellen(playerid, params[]) { static const info[] = "[ {ECFF00}Information{FFFFFF} ]: /erstellen [Auto]"; // Dann musst es nur an einer Stelle ändern ;) if(!params[0]) return SCM(playerid, WEISS, info); new item[64], idx = strfind(params, " "); strmid(item, params, 0, (idx==-1)?strlen(params):idx); if(!strcmp(item, "auto")) { new pID, vehid, farbe, farbe2; if(sscanf(params,"s[64]iiii", item,pID, vehid, farbe, farbe2))return SCM(playerid,WEISS,"[{ECFF00} AdminInfo {FFFFFF}]: /erstellen [Auto] [playerid] [VehID] [Model] [Farbe] [Farbe 2]"); new Float:xc,Float:yc,Float:zc,Float:rc; GetPlayerPos(pID,xc,yc,zc); GetPlayerFacingAngle(pID,rc); createPlayerCar(pID,vehid, xc, yc, zc, rc); } return SCM(playerid, WEISS, info); }