Könntest du den Fehler posten?
Lasse dir, falls du es noch nicht gemacht hast, die Fehlermeldung per crashdetect Plugin ausgeben.
Beiträge von Jeffry
-
-
Das kommt darauf an was du machen willst. Syntaktisch geht es, wenn es so sein soll, wüsste ich nichts was dagegen spricht.
-
Das enum mit Deklaration muss dann so aussehen:
C
Alles anzeigenenum playercarEnum { pc_vID, besitzer[MAX_PLAYER_NAME], modelid, Float:s_x, Float:s_y, Float:s_z, Float:s_r, db_id } new pCar[MAX_PLAYERS][2][playercarEnum];Man könnte den Besitzer auch weg lassen, da du ja über die playerid auf den Besitzer-Name kommst. Das kannst du aber halten wie du willst.
Die 2 steht für die Anzahl der Fahrzeuge pro Spieler.
Die modelid habe ich hinzugefügt.
Die db_id habe ich außerdem hinzugefügt. Da muss die AUTO_INCREMENT id aus der Datenbank rein, damit du das Fahrzeug auch wieder speichern kannst.
Füge beide bitte auch in deiner Tabelle hinzu, falls du das noch nicht hast.Dann dort wo die Fahrzeuge laden sollen:
Cmysql_format(db_handle,query,sizeof(query),"SELECT * FROM usercars WHERE besitzer = '%s'",GPlayerName(playerid)); mysql_tquery(db_handle,query,"LoadPlayerCars","i",playerid);
Und dann die Lade-Funktion so:C
Alles anzeigenforward LoadPlayerCars(playerid); public LoadPlayerCars(playerid) { new rows = cache_get_row_count(); for(new i=0; i<rows; i++) { if(i > sizeof(pCar[])) return 1; cache_get_field_content_int(i, "besitzer", pCar[playerid][i][besitzer], db_handle, MAX_PLAYER_NAME); pCar[playerid][i][modelid] = cache_get_field_content_int(i, "modelid"); pCar[playerid][i][db_id] = cache_get_field_content_int(i, "id"); pCar[playerid][i][s_x] = cache_get_field_content_float(i, "s_x"); pCar[playerid][i][s_y] = cache_get_field_content_float(i, "s_y"); //Gegebenenfalls musst du hier noch die Spaltennamen aus der Tabelle anpassen. pCar[playerid][i][s_z] = cache_get_field_content_float(i, "s_z"); pCar[playerid][i][s_r] = cache_get_field_content_float(i, "s_r"); pCar[playerid][i][pc_vID] = CreateVehicle(pCar[playerid][i][modelid], pCar[playerid][i][s_x], pCar[playerid][i][s_y], pCar[playerid][i][s_z], pCar[playerid][i][s_r], -1, -1, -1); } return 1; }Wie gesagt, du musst die Spaltennamen gegebenenfalls anpassen, wie sie bei dir heißen.
Das Speichern würde dann so aussehen:
C
Alles anzeigenstock SavePlayerCars(playerid) { new query[256]; for(new i=0; i<sizeof(pCar[]); i++) { if(pCar[playerid][i][pc_vID] == 0) continue; GetVehiclePos(pCar[playerid][i][pc_vID], pCar[playerid][i][s_x], pCar[playerid][i][s_y], pCar[playerid][i][s_z]); GetVehicleZAngle(pCar[playerid][i][pc_vID], pCar[playerid][i][s_r]); mysql_format(db_handle, query, sizeof(query), "UPDATE usercars SET modelid = '%d', s_x = '%f', s_y = '%f', s_z = '%f', s_r = '%f', besitzer = '%s' WHERE id = '%d'", pCar[playerid][i][modelid], pCar[playerid][i][s_x], pCar[playerid][i][s_y], pCar[playerid][i][s_z], pCar[playerid][i][s_r], pCar[playerid][i][besitzer], pCar[playerid][i][db_id]); mysql_pquery(db_handle, query); } return 1; }
Die Zuweisung (Besitzer?) wäre dann so:Wobei i eben die Fahrzeugnummer ist, also das erste (0) oder zweite (1) Fahrzeug des Spielers. Ich weiß nicht ob du das über Keys (Schlüssel) machst, oder automatisch.
Über Keys:Cnew i = carKey[playerid]; format(pCar[playerid][i][besitzer], MAX_PLAYER_NAME, GPlayerName(playerid));
Über automatische freie Suche:Cnew i = getFreeCarID(playerid); if(i == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du hast bereits die maximale Anzahl an Fahrzeugen."); format(pCar[playerid][i][besitzer], MAX_PLAYER_NAME, GPlayerName(playerid));Dazu dann dieser stock:
Cstock getFreeCarID(playerid) { for(new i=0; i<sizeof(pCar[]); i++) { if(pCar[playerid][i][pc_vID] == 0) return i; } return -1; }Der IsPlayerOwnerOfCar-stock sieht dann so aus:
C
Alles anzeigenstock IsPlayerOwnerOfCar(playerid,vID) { if(IsPlayerConnected(playerid)) { for(new i=0; i<sizeof(pCar[]); i++) { if(pCar[playerid][i][pc_vID] == vID) return 1; } } return 0; }Weitere Funktionen, wie zum Beispiel das Entfernen der Fahrzeuge beim Disconnect kannst du analog zur SavePlayerCars Funktion machen. Die Schleife mit der Abfrage darin stehen jeweils für alle existierenden Fahrzeuge des Spielers.
Schau mal ob du damit klar kommst. Bei Fragen kannst du natürlich gerne nachfragen.Ist jetzt etwas viel geworden, aber ich dachte mir bevor ich dir das als Pseudo-Code oder Lückentext gebe, schreibe ich es lieber gleich vollständig kurz zusammen, dann hilft es vielleicht auch dem einen oder anderen, der auf diesen Thread stößt, weiter. Daher ist es auch gut, dass du einen eigenen Thread erstellt hast (was sich eigentlich meistens empfielt).
-
Du sprichst von "die Autos". Wie viele Fahrzeuge kann ein Spieler besitzen?
Davon ist der Code nämlich sehr stark abhängig (eins oder mehrere).
Außerdem gehe ich davon aus, dass die Fahrzeuge (bzw. das Fahrzeug) entfernt werden, wenn der Spieler den Server verlässt, oder?Auch dein Stock ist davon abhängig. Wenn du jetzt angenommen nur ein Fahrzeug pro Spieler erlaubst, dann würde die Prüfung so aussehen, unter obiger Annahme:
Cstock IsPlayerOwnerOfCar(playerid,vID) { if(IsPlayerConnected(playerid)) { if(pCar[playerid][pc_vID] == vID) return 1; } return 0; }
Zu dem Error den du im Code hast:Das ist nicht erlaubt, da man mehrdimensionalen Arrays keinen Wert direkt zuweisen kann/darf.
Du musst entweder strcat oder format nutzen. Ich schlage immer format vor, da sich die meisten mehr darunter vorstellen können. -
Du musst den alten Wert von "str" wieder mitnehmen.
Versuche es so:C
Alles anzeigenif(strcmp(cmd, "/dienstwagen", true) == 0) { new str[1024], pname[MAX_PLAYER_NAME]; if(IsPlayerConnected(playerid)) { if(PlayerInfo[playerid][pLeader]==1) { if(OnDuty[playerid]==1) { new bool:one = false; for(new i=0; i < MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { if(PlayerInfo[i][pMember]==1) { switch(PlayerInfo[i][SAPDWagen]) { case 0:{Wagenerlaubnistext="{00FF00}Hat noch kein Dienstwagen"; } case 1:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-1"; } case 2:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-2"; } case 3:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-3"; } case 4:{Wagenerlaubnistext="{00FF00}SAPD Ranger {FFFF00}Kennzeichen: {00FF00}PD-LSPD-4"; } case 5:{Wagenerlaubnistext="{00FF00}SAPD Ranger {FFFF00}Kennzeichen: {00FF00}PD-LSPD-5"; } case 6:{Wagenerlaubnistext="{00FF00}SAPD Ranger {FFFF00}Kennzeichen: {00FF00}PD-LSPD-6"; } case 7:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-7"; } case 8:{Wagenerlaubnistext="{00FF00}Cop Car SF {FFFF00}Kennzeichen: {00FF00}PD-LSPD-8"; } case 9:{Wagenerlaubnistext="{00FF00}Cop Car SF {FFFF00}Kennzeichen: {00FF00}PD-LSPD-9"; } case 10:{Wagenerlaubnistext="{00FF00}Cop Car SF {FFFF00}Kennzeichen: {00FF00}PD-LSPD-10"; } case 11:{Wagenerlaubnistext="{00FF00}Bullet {FFFF00}Kennzeichen: {00FF00}PD-LSPD-11"; } case 12:{Wagenerlaubnistext="{00FF00}Infernus {FFFF00}Kennzeichen: {00FF00}PD-LSPD-12"; } case 13:{Wagenerlaubnistext="{00FF00}Sultan {FFFF00}Kennzeichen: {00FF00}PD-LSPD-13"; } case 14:{Wagenerlaubnistext="{00FF00}Sultan {FFFF00}Kennzeichen: {00FF00}PD-LSPD-14"; } case 15:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-15"; } case 16:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-16"; } case 17:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-17"; } case 18:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-18"; } case 19:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-19"; } case 20:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-20"; } case 21:{Wagenerlaubnistext="{00FF00}Enforcer {FFFF00}Kennzeichen: {00FF00}PD-LSPD-21"; } case 22:{Wagenerlaubnistext="{00FF00}Enforcer {FFFF00}Kennzeichen: {00FF00}PD-LSPD-22"; } case 23:{Wagenerlaubnistext="{00FF00}Enforcer {FFFF00}Kennzeichen: {00FF00}PD-LSPD-23"; } case 24:{Wagenerlaubnistext="{00FF00}Cop Car LV {FFFF00}Kennzeichen: {00FF00}PD-LSPD-24"; } case 25:{Wagenerlaubnistext="{00FF00}Cop Car LV {FFFF00}Kennzeichen: {00FF00}PD-LSPD-25"; } case 26:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-26"; } case 27:{Wagenerlaubnistext="{00FF00}Rechter Heli {FFFF00}Kennzeichen: {00FF00}PD-LSPD-27"; } case 28:{Wagenerlaubnistext="{00FF00}Linker Heli {FFFF00}Kennzeichen: {00FF00}PD-LSPD-28"; } case 29:{Wagenerlaubnistext="{00FF00}Bus {FFFF00}Kennzeichen: {00FF00}PD-LSPD-29"; } case 30:{Wagenerlaubnistext="{00FF00}SAPD Ranger {FFFF00}Kennzeichen: {00FF00}PD-LSPD-30"; } case 31:{Wagenerlaubnistext="{00FF00}Cop Car SF {FFFF00}Kennzeichen: {00FF00}PD-LSPD-31"; } case 32:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-32"; } case 33:{Wagenerlaubnistext="{00FF00}Cop Car LS {FFFF00}Kennzeichen: {00FF00}PD-LSPD-33"; } case 34:{Wagenerlaubnistext="{00FF00}Stretchlimousine {FFFF00}Kennzeichen: {00FF00}PD-LSPD-34"; } case 35:{Wagenerlaubnistext="{00FF00}Cop Car LV {FFFF00}Kennzeichen: {00FF00}PD-LSPD-35"; } case 36:{Wagenerlaubnistext="{00FF00}HPV-1000 {FFFF00}Kennzeichen: {00FF00}PD-LSPD-36"; } case 37:{Wagenerlaubnistext="{00FF00}HPV-1000 {FFFF00}Kennzeichen: {00FF00}PD-LSPD-37"; } case 38:{Wagenerlaubnistext="{00FF00}HPV-1000 {FFFF00}Kennzeichen: {00FF00}PD-LSPD-38"; } case 39:{Wagenerlaubnistext="{00FF00}HPV-1000 {FFFF00}Kennzeichen: {00FF00}PD-LSPD-39"; } } GetPlayerName(i, pname, MAX_PLAYER_NAME); format(str, sizeof(str), "%s\n{FFFF00}SAPD Member {00FF00}%s{FFFF00} [ID:{00FF00}%d{FFFF00}]\n{FFFF00}DienstWagen: {00FF00}%s",str,pname,i,Wagenerlaubnistext); one = true; } } } if(!one) ShowPlayerDialog(playerid,INFODIALOG,DIALOG_STYLE_MSGBOX, "{FFFF00}Dienstwagen", "Keiner Online"," Ok ",""); else ShowPlayerDialog(playerid, INFODIALOG, DIALOG_STYLE_MSGBOX, "{FFFF00}Dienstwagen", str, " Ok ",""); } else { SendClientMessage(playerid, TEAM_BLUE_COLOR,"Du bist nicht im Dienst"); } } else if(PlayerInfo[playerid][pMember]==1) -
Synchron sind die eigentlich, zumindest sollte es so sein.
Suchst du sowas? http://forum.sa-mp.com/showthread.php?t=509952 -
Das kannst du machen, da gehen wesentlich mehr Zeichen, und bei mehreren Spielern sieht das wahrscheinlich auch besser aus.
-
In dem Code den du hier insgesamt gepostet hast, hast du nur ein Create3DTextLabel drin, dass das doppelt erstellt wird haben wir ja ausgeschlossen. Bist du dir sicher, dass kein Label an einer anderen Stelle erstellt wird?
-
Erstellst du das Label vielleicht noch woanders?
Prüfe mal alle deine Stellen, an denen du ein Label setzt und alle an denen du eins attachest. -
Das liegt daran, dass der String "str" zu lang wird. SendClientMessage kann nur 144 + 1 (EOS) Zeichen ausgeben.
Setze "str" auf 145 bei der Deklaration, dann siehst du bis wohin der Text ausgegeben werden kann. -
-
-
Dann wird OnPlayerSpawn wahrscheinlich zwei mal aufgerufen.
Versuche es so:C
Alles anzeigennew Text3D:C4verkeaufertext = Text3D:-1; Function OnPlayerSpawn(playerid) { else if(!strcmp(botname, "C4Verkeaufer", true)) { Delete3DTextLabel(C4verkeaufertext); C4verkeaufertext = Create3DTextLabel("{FFFF00}Guten Tag \nAlso Lester schickt dich wegen den C4\ngebe '{00FF00}/c4holen {FFFF00}", 0x008080FF, 30.0, 40.0, 50.0, 40.0, 0); Attach3DTextLabelToPlayer(C4verkeaufertext, playerid, 0.0, 0.0, 0.7); SetPlayerSpecialAction(playerid,SPECIAL_ACTION_NONE); SetPlayerInterior(playerid,0); SetPlayerVirtualWorld(playerid,0); PlayerInfo[playerid][pModel] = 29; SetPlayerSkin(playerid, PlayerInfo[playerid][pModel]); } } -
(Hoffe man versteht was ich meine..)
Nein, sorry. Was meinst du?
-
C
Alles anzeigenocmd:autokauf(playerid,params[]) { if(IsPlayerInRangeOfPoint(playerid,5,1283.2334,-1336.0128,13.3811)) { new str[250]; for(new i=0;i<sizeof(ahCars);i++) { if(ahCars[i][ah_id] !=0)continue; format(str, sizeof(str), "%s%s\n", str, ahCars[i][Name]); } ShowPlayerDialog(playerid,D_AH_OLDTIMER,DIALOG_STYLE_LIST,"Oldtimer Autohaus",str,"Annehmen","Abbrechen"); return 1; } SCM(playerid,frot,"[FEHLER]:{FFFFFF} Du befindest dich an keinem Autohaus"); return 1; }Bei "new ahCars" musst du die 2 noch zu einer 3 ändern, oder einfach ganz entfernen, das geht auch, einfach nur [].
-
Bei dem enum oben fehlt die Model ID. Hast du die mittlerweile eingebaut, oder was willst du angezeigt bekommen, im Dialog?
-
-
Was passiert, wenn du was machst, und was sollte eigentlich passieren?
Erkläre das bitte genauer. -
Kannst du den String des MD5 Wertes aus der Datenbank bitte mal posten? Gebe als Passwort bei der Registrierung Test oder Passwort ein.
Der Download-Button funktioniert anscheinend nicht mehr.
Du kannst die Daten aus dem Anhang herunterladen. Der Button verweist nur dahin, ist aber durch die Umstellung der Domain nicht mehr aktuell. Ich werde das am Wochenende in allen meinen Threads anpassen.
-
Definiere "korrekt erstellt".
Existiert es, wenn du an die Position gehst, an der es erstellt wird? Und ist das in der gleichen virtuellen Welt, in der der NPC ist?
Setze zudem mal noch vor oder nach dem PutPlayerInVehicle(playerid, TAXI_TUT_CAR, 0); einen printf("Aufgerufen."); hin, um zu sehen, ob der Code überhaupt ausgeführt wird. Steht der Print dann im Server Log?