Nach dieser Zeile:
Spieler[playerid][pWantedPoints] = 0;
Natürlich musst du pID im switch zu playerid ändern.
Nach dieser Zeile:
Spieler[playerid][pWantedPoints] = 0;
Natürlich musst du pID im switch zu playerid ändern.
Was würde das bringen? Er will die Sprache des Spielers einstellen, so wäre es ja für alle gleich.
So:
if(dialogid == Dialog_psprache)
{
if(response)
{
if(listitem == 0)
{
sprached[playerid] = 1;
}
else if(listitem == 1)
{
sprachee[playerid] = 1;
}
}
else
{
Kick(playerid);
}
return 1;
}
@Windows: Du kannst aber auch einfach sagen "sprache[playerid] = 1;" ist deutsch, und "sprache[playerid] = 2;" ist englisch. Das spart Speicher. ![]()
EDIT: (Post unten)
@Windows: Gerne! Da dein Problem behoben ist, wäre es super, wenn du den Thread als erledigt markierst. Danke!
Schreibe den switch einfach nach dem GivePlayerWPS hin:
Mit strtok kannst du strings nach Leerzeichen splitten. Mehr nicht.
Der Rest wird ja durch andere Funktionen (z.B. strval) gemacht. Je nach dem was du auslesen willst, musst du die entsprechenden Funktionen kennen (floatstr, IsNumeric, ...).
Es ist langsamer, allerdings merkst du im Spielgeschehen keinen Unterschied, da dies weniger als Millisekunden ausmacht.
Daher ist es für mich erste Wahl, da ich nicht von einem Plugin abhängig bin, das von Version zu Version aktualisiert werden muss.
Nicht direkt. Kommt auf dein Vorhaben an, aber wenn du nur solche Befehle erstellen willst, dann passt das so.
Da strtok nicht viel macht, muss man auch nicht viel dazu wissen. Es gibt einfach nur einen String zurück, den man dann entsprechend verarbeiten muss.
Klar, oft schreibt man die strtok's auch einfach hintereinander, je nach dem wie einem das gefällt. Ändern tut es nichts.
if(!strcmp(cmd, "/veh", true))
{
new vehicleid[20],color1[20],color2[20], string[60], Float:mp[4];
vehicleid=strtok(cmdtext,idx), color1=strtok(cmdtext,idx), color2=strtok(cmdtext,idx);
if(!strlen(color2) || !IsNumeric(vehicleid) || !IsNumeric(color1) || !IsNumeric(color2))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
format(string,sizeof string,"Du hast dir ein Fahrzeug erstellt. (%i|%i,%i)",strval(vehicleid),strval(color1),strval(color2)),
SendClientMessage(playerid,-1,string);
GetPlayerPos(playerid,mp[0],mp[1],mp[2]),GetPlayerFacingAngle(playerid,mp[3]),
CreateVehicle(strval(vehicleid),mp[0],mp[1],mp[2],mp[3],strval(color1),strval(color2),-1);
return 1;
}
Funktioniert genau gleich, nur dass dann eben der erste strtok-Wert den eingegebenen Befehl darstellt.
Falls Fragen sind, einfach nachfragen.
strtok FTW ![]()
Wie genau muss die Erklärung sein?
Reicht dir das hier erst mal?
Tutorial: http://forum.sa-mp.com/showthread.php?t=188617
Funktionen die du benötigst, für den guten Umgang mit strtok:
stock strtok(const string[], &index) //©Jeffry
{
new result[20], length = strlen(string), i = index;
while ((i < length) && (string[i] == ' ')) i++;
strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
index++;
return result;
}
stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
{
new l_name[MAX_PLAYER_NAME];
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
{
if(!strcmp(l_name,l_PlayerName, true)) return i;
}
}
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
{
if(strfind(l_name,l_PlayerName,true)!=-1) return i;
}
}
return INVALID_PLAYER_ID;
}
stock IsNumeric(string[])
{
for (new i = 0, j = strlen(string); i < j; i++)
{
if ((string[i] > '9' || string[i] < '0')) return 0;
}
return 1;
}
Beispielbefehl:
dcmd_befehl(playerid,params[])
{
new pID, tmp[20], idx;
tmp = strtok(params, idx);
if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000FF,"Fehler: /befehl [playerid/SpielerName]");
if(IsNumeric(tmp)) pID = strval(tmp);
else pID = ReturnPlayerID(tmp);
if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,0xFF0000FF,"Der Spieler ist nicht online");
//Code hier.
return 1;
}
Nein, aber hier willst du einen String auslesen, da muss es so sein. Bei Floats und Integern nicht.
Ändere playerid zu wantedplayer.
gInfo[i][Owner] = cache_get_field_content(i,"Owner",gInfo[i][Owner],MySqlConnection);
zu:
cache_get_field_content(i,"Owner",gInfo[i][Owner],MySqlConnection,24);
format(ltext,128,"Garage von "#SERVERFARBE"%s "#HTML_WHITE"\nStatus: %s",SpielerName(gInfo[gid][Owner]),GetLockedStatus(gInfo[gid][Locked]));
zu:
format(ltext,128,"Garage von "#SERVERFARBE"%s "#HTML_WHITE"\nStatus: %s",gInfo[gid][Owner],GetLockedStatus(gInfo[gid][Locked]));
Der Fehler hat überhaupt nichts mit dem SpielerSpeichern zu tun, sondern kommt vom Laden der Daten aus der Datenbank.
...und wie oft muss eigentlich noch gesagt werden, dass dieser Thread für kleine Fragen ist und nicht zum debuggen von MySQL Codes?
An sich schon, nur muss der switch dort hin, wo du dem Spieler das Wanted weg machst, und nicht da wo du es hast, dort gibst du ihm ja das Wanted.
Dann hast du den Code entweder nicht kompiliert, oder du startest den falschen Server. Prüfe mal, ob die amx Datei aktuell ist (Änderungsdatum).
Gegebenenfalls ist die Zahl, die bei "new query" in Klammern steht zu klein. Mach die mal um 50 größer.
Nach dem MD5 hat eine Klammer gefehlt.
So:
format(query, sizeof(query), "INSERT INTO (username, password) VALUES ('%s',MD5('%s'))",getPlayerName(playerid), key);
Füge da mal nach CarHealthColor im TankSchadenTimer Callback das hier ein:
PlayerTextDrawShow(playerid,Textdraw7[playerid]);
Wie startest du denn den Timer? Ist das ein anderes Callback, dass die Funktion aufruft?