Du darfst den Cache erst im Callback, welches in mysql_pquery angegeben wird, auslesen.
Gleich wie beim hier im Tutorial beschriebenen Login.
Du darfst den Cache erst im Callback, welches in mysql_pquery angegeben wird, auslesen.
Gleich wie beim hier im Tutorial beschriebenen Login.
Dann sollte man vorher noch nen Spawn definieren....
Das ändert trotzdem nichts, denn der Spieler ist dann ja schon gespawnt, laut Anforderung soll nur der Spawn Button entfernt werden, der Spieler aber nicht automatisch gespawnt werden.
Das geht mit SetSpawnInfo und TogglePlayerSpectating am einfachsten.
Spawn balken weg bekommen.
Aber egal, solange sich der TE nicht meldet.
Hat er doch schon, das Thema ist schon lange durch. Er hat seinen Like (=Danke) an Rocky Balboa gegeben. Damit hat sich die Sache.
Ums mal zu Ende zu bringen:
Das spawnt den Spieler direkt und entfernt nicht nur den Spawn Button.
Hat hiermit also nichts zu tun.
@Rocky Balboa hat genügend Links gepostet, es muss nichts mehr zu Ende gebracht werden.
Wenn du unter OnPlayerConnect & OnPlayerRequestClass folgendes einfügst, wird der "Spawn-Dialog" automatisch terminiert
Das startet nur einen Timer. Wenn das public "login_dialog" nicht definiert ist, bringt das gar nichts, der Timer läuft dann ins Leere.
Hast du noch einen anderen Command Prozessor im Code, außer ocmd?
Setze bitte mal einen Print direkt als erstes vor die erste if-Abfrage im Befehl.
Wird diese im Server Log angezeigt? Wenn nein, dann wird der Befehl gar nicht aufgerufen, das heißt er wird durch irgendetwas anderes (z.B. einen anderen Command Prozessor) blockiert.
Es wird kein Fehler ausgegeben.
Funktioniert der Befehl denn, oder kommt nur "Unknown Command" und sonst passiert nichts?
im server.log
Lade dir das Crashdetect Plugin herunter und füge es in deinen Server ein:
http://forum.sa-mp.com/showthread.php?t=262796
Erstelle zusätzlich im Ordner /pawno/ eine Datei "pawn.cfg" und schreibe dort "-d3" rein.
Dann öffne die pawno.exe aus diesem Ordner heraus und kompiliere deinen Code erneut.
Reproduziere dann den Fehler, dann sollte die Problemzeile im server.log ausgegeben werden.
Die Spieler, die auf die anderen Sitze verteilt werden sollten, werden nicht in die Fahrzeuge gesetzt.
Stimmt, der Wert von dem der Random-Wert genommen wird, läuft dann ins negative.
Versuche es so:
new string[128], count, rand, bool:used[sizeof(RoundCars)], seat = 0;
for(new i=0;i<MAX_PLAYERS;i++)
{
if(GetPVarInt(i,"JointInRunde") == 1 && IsPlayerConnected(i))
{
rand = random(sizeof(RoundCars) - count);
for(new j = 0; j < sizeof(used); j++)
{
if(!used[j])
{
if(rand == 0)
{
if(seat == 0) RoundCars[j][carID] = CreateVehicle(RoundCars[j][carModel],RoundCars[j][X],RoundCars[j][Y],RoundCars[j][Z],RoundCars[j][R],RoundCars[j][color1],RoundCars[j][color2],0);
PutPlayerInVehicle(i,RoundCars[j][carID],seat);
format(string,sizeof(string),"[DEBUG] Fahrzeug: %i, PlayerID: %i, SpielerInRunde: %i",j,i,SpielerInRunde);
SendClientMessageToAll(-1,string);
used[j] = true;
count++;
if(count >= sizeof(RoundCars))
{
count = 0;
seat++;
for(new u = 0; u < sizeof(used); u++) used[u] = false;
}
break;
}
else
{
rand--;
}
}
}
}
}
Sprich, wenn mehr Spieler als Fahrzeuge existieren, würden diese die anderen Spieler aus dem Fahrzeug werfen.
Diese würden dann kein Fahrzeug bekommen, da used = true ist.
Wie kann ich es am besten machen das die Spieler die in die Fahrzeuge gesetzt werden wenn schon jemand anderes im Fahrzeug sitzt auf einen anderen Platz gesetzt werden?
Versuche es mal so:
new string[128], count, rand, bool:used[sizeof(RoundCars)], placed, seat = 0;
for(new i=0;i<MAX_PLAYERS;i++)
{
if(GetPVarInt(i,"JointInRunde") == 1 && IsPlayerConnected(i))
{
rand = random(sizeof(RoundCars) - count);
for(new j = 0; j < sizeof(used); j++)
{
if(!used[j])
{
if(rand == 0)
{
if(seat == 0) RoundCars[j][carID] = CreateVehicle(RoundCars[j][carModel],RoundCars[j][X],RoundCars[j][Y],RoundCars[j][Z],RoundCars[j][R],RoundCars[j][color1],RoundCars[j][color2],0);
PutPlayerInVehicle(i,RoundCars[j][carID],seat);
format(string,sizeof(string),"[DEBUG] Fahrzeug: %i, PlayerID: %i, SpielerInRunde: %i, Seat: %i",j,i,SpielerInRunde, seat);
SendClientMessageToAll(-1,string);
used[j] = true;
count++;
placed++;
if(placed >= sizeof(RoundCars))
{
placed = 0;
seat++;
for(new u = 0; u < sizeof(used); u++) used[u] = false;
}
break;
}
else
{
rand--;
}
}
}
}
}
Das heißt, sobald alle Fahrzeuge vergeben sind, zählt der Sitz-Zähler um eins hoch und setzt die restlichen Spieler random auf Sitz 1, solange bis alle Sitz 1 Plätze voll sind, das gleiche dann für Platz 2, etc.
Und nochmal:
Bitte keine Voll-Zitate von Posts, das macht doch keinen Sinn! Zumal der Post direkt drüber steht. Das macht das Lesen nur absolut unübersichtlich.
Ich rate dir, nochmal von vorne zu beginnen und dieses Tutorial durchzuarbeiten:
[jTuT] MySQL R41-4 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System)
Dann hast du am Ende einen sauberen Code, der funktioniert.
Arbeite es gewissenhaft Schritt für Schritt durch, sonst lernst du nichts dabei.
Du nutzt nämlich auch noch eine ältere MySQL Plugin Version, damit solltest du erst gar nicht mehr anfangen.
Mit Floats hatte ich auch schon mehrfach Probleme, das kann immer mal vorkommen.
Noch eine Alternative wäre dann eventuell:
if(0.99 < collected[playerid] < 1.01)
1 Jahr Verlängerung von Domain und Webspace bei signaltransmitter.de.
Aktuell kommt es vor das ein Spieler 3-4 mal hintereinander das selbe Fahrzeug bekommt. @Jeffry
rand = random(SpielerInRunde - count);
zu:
rand = random(sizeof(RoundCars) - count);
Ist halt nicht passend, wenn die Fahrzeuge hintereinander stehen. Falls wild durcheinander, dann geht das so und es ist viel zufälliger bei geringen Spielerzahlen.
Normalerweise sollte es mit einer normalen Abfrage == 1.0 klappen.
Falls nicht, wäre die Alternative eventuell so zu versuchen:
format(string2, sizeof(string2), "%.1f%%",collected[playerid]);
format(string3, sizeof(string3), "1.0%%");
if(!strcmp(string2, string3))
{
//1.0
}
Wichtig ist das "%%", sonst bekommst du das nicht als "%" angezeigt. Das muss natürlich dann auch so mit abgefragt werden.
Bei deinem Code wir immer nur rand--; ausgeführt.
Oh, stimmt.
for(new j = 0; j < rand; j++)
zu:
for(new j = 0; j < sizeof(used); j++)
Dann sollte es klappen. Wollte es erst anders umsetzen und habe dann die Schleife nicht mehr angepasst.
Danke dir schonmal aber ab if(rand == 0) wird nichts ausgeführt.
Inwiefern?
PS: Bitte keine Code-Zitate / Kompletter-Post-Zitate.
ShowPlayerDialog(DIALOG_REGISTER),DIALOG_STYLE_PASSWORD,"Neuanfang","Herzlich Willkommen auf GRG server Bitte gebe dein gewünchtes password ein.","Weiter","Abrechen");
zu:
ShowPlayerDialog(playerid, DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,"Neuanfang","Herzlich Willkommen auf GRG server Bitte gebe dein gewünchtes password ein.","Weiter","Abrechen");
ShowPlayerDialog(DIALOG_REGISTER),DIALOG_STYLE_PASSWORD,"Einloggen","Herzlich Willkommen Zurück auf GRG server Bitte gebe dein gewünchtes password ein.","Weiter","Abrechen");
zu:
ShowPlayerDialog(playerid, DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,"Einloggen","Herzlich Willkommen Zurück auf GRG server Bitte gebe dein gewünchtes password ein.","Weiter","Abrechen");
TogglePlayerSpectating(playerid,1);
Um ein Leerzeichen auf die gleiche Höhe wie ClearChat(playerid); setzen, sprich:
ClearChat(playerid);
TogglePlayerSpectating(playerid,1);
zu:
ClearChat(playerid);
TogglePlayerSpectating(playerid,1);
Hey, wie bekomme ich es hin das bei der random Funktion jeder Wert nur einmal rauskommen kann.
new string[128], count, rand, bool:used[sizeof(RoundCars)];
for(new i=0;i<MAX_PLAYERS;i++)
{
if(GetPVarInt(i,"JointInRunde") == 1 && IsPlayerConnected(i))
{
rand = random(SpielerInRunde - count);
for(new j = 0; j < sizeof(used); j++)
{
if(!used[j])
{
if(rand == 0)
{
RoundCars[j][carID] = CreateVehicle(RoundCars[j][carModel],RoundCars[j][X],RoundCars[j][Y],RoundCars[j][Z],RoundCars[j][R],RoundCars[j][color1],RoundCars[j][color2],0);
PutPlayerInVehicle(i,RoundCars[j][carID],0);
format(string,sizeof(string),"[DEBUG] Fahrzeug: %i, PlayerID: %i, SpielerInRunde: %i",j,i,SpielerInRunde);
SendClientMessageToAll(-1,string);
count++;
used[j] = true;
break;
}
else
{
rand--;
}
}
}
}
}
Was macht der Code?
Er gibt einen Random Wert aus, für die noch übrige Anzahl an Spieler, die noch kein Fahrzeug erhalten haben. Das heißt, mit jedem Durchlauf einer weniger, da ja auch ein Fahrzeug weniger zur Verfügung steht.
Anschließend nimmt der das x-te freie Auto, welches entsprechend dem Random-Wert gefunden wurde. Heißt, wenn random 3 ist, dann nimmt er das vierte freie Auto in der Liste.
Somit kommt kein Auto zwei mal dran.
cache_get_value_name_string ?
Nur:
cache_get_value_name
http://wiki.sa-mp.com/wiki/MySQL/R40#cache_get_value_name
Und kann mir noch jemand sagen wie man die Auto inkrementierung bei 0 beginnen lassen kann?
https://stackoverflow.com/ques…-from-0-but-starts-from-1
Allerdings solltest du eher darauf verzichten, die Zeilen mit 0 zu beginnen.
Besser wäre es, den AUTO_INCREMENT Wert trotzdem auf 1+ zu lassen, und parallel dazu eine zweite Spalte zu erstellen, die dann den AUTO_INCREMENT Wert -1 bekommt.
Somit wäre dann 1 -> 0, 2 -> 1, 3 -> 2, etc...
Oder eben von 1 beginnen zu zählen, das wäre die beste Möglichkeit.