Achso, so rum. Hab's jetzt kapiert.
Bekommst du eine Meldung im Chat, wenn du das Fahrzeug parken willst und es nicht geht?
Beiträge von Jeffry
-
-
Wie lädst du das WantedLevel aus der ini Datei?
-
Ahh, ok.
Schreibe es so, da haben die else's gefehlt. Eigentlich müsste es dir den letzten Checkpoint angezeigt haben.forward Race(playerid);
public Race(playerid)
{
if(LSRACE[playerid] == 1)
{
SetPlayerCheckpoint(playerid,936.4375,-968.8925,38.5286,8);
LSRACE[playerid] = 2;
}
else if(LSRACE[playerid] == 2)
{
SetPlayerCheckpoint(playerid,804.7927,-1047.2712,25.1715,8);
LSRACE[playerid] = 3;
}
else if(LSRACE[playerid] == 3)
{
SetPlayerCheckpoint(playerid,804.7927,-1047.2712,25.1715,8);
LSRACE[playerid] = 4;
}
else if(LSRACE[playerid] == 4)
{
LSRACE[playerid] = 5;
}
else if(LSRACE[playerid] == 5)
{
LSRACE[playerid] = 6;
}
//RaceLS[playerid];// = RaceLS[playerid] +1;
printf("%s = %i",SpielerName(playerid,RaceLS[playerid]);
return 1;
} -
Syntaktisch erst mal nichts.
Schreibe es dennoch so, dann ist es auch semantisch richtig:
if(newkeys == KEY_NO)//Taste N
{
if(IsPlayerInRangeOfPoint(playerid,5.0,597.5695,-1552.5271,25.9700))//Fahrschule Waffen Punkt
{
if(IsPlayerInFrac(playerid, 11))
{
ShowPlayerDialog(playerid,DIALOG_FAHRSCHULEWAFFEN, DIALOG_STYLE_LIST, "Fahrschule", "{FF0008}1: {FFFBFF}Schutzweste\n{FF0008}2: {FFFBFF}Spray", "Auswählen", "Abbrechen");
}
else
{
SendClientMessage(playerid,GRAU,"Du bist nicht bei der Fahrschule!");
}
}
if(IsPlayerInRangeOfPoint(playerid,5.0,X,Y,Z))//HitmanWaffen Punkt
{
if(IsPlayerInFrac(playerid, 2))
{
ShowPlayerDialog(playerid,DIALOG_HITMANWAFFE, DIALOG_STYLE_LIST, "Hitman", "{FF0008}1: {FFFBFF}Sniper\n{FF0008}2: {FFFBFF}M4", "Auswählen", "Abbrechen");
}
else
{
SendClientMessage(playerid,GRAU,"Du bist nicht bei den Hitmans!");
}
}
}Falls du immer noch Errors bekommst, poste bitte das ganze Callback (public).
-
Wie sieht es aus mit den Nachrichten im Chat? Welche kommen? Wird der Timer "Race" aufgerufen (mach den print mal ein, kommt der?)?.
-
Korrekt.
-
SetPlayerWantedLevel(playerid, WantedLevel[playerid]);
-
Verwendest du beim Laden der wanteds auch SetPlayerWantedLevel?
-
An sich (abgesehen davon, dass es nicht dynamisch ist) passt es eigentlich. Nur hier hast du einen kleinen Fehler gemacht, deshalb wird dir der Checkpoint der Startlinie nicht angezeigt:
ocmd:startrace(playerid,params[])
{
SetTimerEx("Racestart",10000,false,"");
SendClientMessageToAll(CL_ORANGE,"Das Rennen startet in 10 Sekunden");
for(new i=0; i<MAX_PLAYERS; i++)
{
if(jEvent[i] == 1) continue;
TogglePlayerControllable(i,1);
SetPlayerCheckpoint(i,1159.2834,-929.9013,43.23885,8); //Startlinie
}
return 1;
}
Ändere die Abfrage zu:
if(jEvent[i] != 1) continue;Außerdem solltest du bei dem Racestart Callback das SendClientMessageToAll aus der Schleife nehmen.

-
Ahhh, ja das ist klar. Du stehst neben dem Fahrzeug und wechselst den Clan/Gang? Dann macht das natürlich Sinn, da das Fahrzeug für dich noch immer gesperrt ist.
Da müsstest du dan entweder den Code nehmen, den Icy. gepostet hat (da der ja auf den Spieler und nicht auf das Fahrzeug zugreift), oder du fügst bei dem Code, mit dem du die Gang wechselst den Code mit SetVehicleParamsForPlayer (den aus deinem OnPlayerEnterVehicle) ohne die GetPlayerVehicleID-Abfrage hinzu.
Sprich eine Schleife durch alle diese Fahrzeuge, die dann entsperrt oder gesperrt werden, je nach dem. Auch wenn du davor stehst. -
So kannst du es schreiben:
dcmd_ranking(playerid,params[])
{
#pragma unused params
new CN1[128],CN2[128],CN3[128],CP1,CP2,CP3,string[256],wert,name[128];
for(new c=0;c<MAX_CLANS;c++)
{
format(string,sizeof(string),"pkt%d",c);
wert = dini_Int("Clans/ranking.txt",string);
format(string,sizeof(string),"name%d",c);
format(name, sizeof(name), dini_Get("Clans/ranking.txt", string));
if(wert > CP3)
{
CP3=wert;
format(CN3, sizeof(CN3), name);
}
if(wert > CP2)
{
CP3 = CP2;
CN3 = CN2;
CP2=wert;
format(CN2, sizeof(CN2), name);
}
if(wert > CP1)
{
CP2 = CP1;
CN2 = CN1;
CP1 = wert;
format(CN1, sizeof(CN1), name);
}
}
format(string, sizeof(string),"Top 3 Clan's:\n \n1. Name: %s - Punkte: %d\n2. Name: %s - Punkte: %d\n3. Name: %s - Punkte: %d",CN1,CP1,CN2,CP2,CN3,CP3);
ShowPlayerDialog(playerid, DIALOG_RANKING, DIALOG_STYLE_MSGBOX,".:: Clan Ranking ::.",string,"Schließen","");
return 1;
}Bei drei Pätzen ist es relativ egal ob du es so machst oder mit einer Schleife.
Angenommen du hättest 100 Plätze, dann kannst du ja nicht alles hinschreiben, da müsstest du eine Schleife verwenden.Ich habe dir es aber erst mal ohne Schleife gemacht, damit du den Unterschied zu deiner Variante siehst, und damit du es besser verstehst und nachvollziehen kannst.
Mit einer Schleife würde es so aussehen:
Spoiler anzeigen dcmd_ranking(playerid,params[])
{
#pragma unused params
new CN[3][128],CP[3],string[256],wert,name[128];
for(new c=0;c<MAX_CLANS;c++)
{
format(string,sizeof(string),"pkt%d",c);
wert = dini_Int("Clans/ranking.txt",string);
format(string,sizeof(string),"name%d",c);
format(name, sizeof(name), dini_Get("Clans/ranking.txt", string));
if(wert > CP[sizeof(CP)-1])
{
CP[sizeof(CP)-1] = wert;
format(CN[sizeof(CP)-1], 128, name);
}
for(new i=sizeof(CP)-2; i>=0; i--)
{
if(wert > CP[i])
{
CP[i+1] = CP[i];
format(CN[i+1], 128, CN[i]);
CP[i]=wert;
format(CN[i], 128, name);
}
else break;
}
}
format(string, sizeof(string),"Top %d Clan's:\n \n",sizeof(CN));
for(new i=0; i<sizeof(CN); i++)
{
format(string, sizeof(string),"%s%d. Name: %s - Punkte: %d\n",string,i+1,CN[i],CP[i]);
}
ShowPlayerDialog(playerid, DIALOG_RANKING, DIALOG_STYLE_MSGBOX,".:: Clan Ranking ::.",string,"Schließen","");
return 1;
}Wie du siehst macht es von der Größe und dem Aufwand kaum einen Unterschied, aber bei 100 Plätzen würde es einen erheblichen Unterschied machen.
Es gibt sicher noch effizientere Sortiermöglichkeiten hier, aber diese ist relativ anschaulich, da sie das gleiche Prinzip verwendet wie der Code oben.Kannst ja beide mal ausprobieren, müsste bei beiden das gleiche rauskommen.

-
Welche Variante meinst du?
Wenn es nach dem Versuch auch für dich nicht mehr geht, hast du die gleicher Spieler ID (playerid)?
-
Dann zeig bitte mal, wie du das Fahrzeug erstellst, lädst und den Befehl um das Fahrzeug aufzuschließen.
Klar ist mir das aber immer noch nicht. Ein privates Fahrzeug darf nicht ausgeschlossen werden?
-
Das mysql.so musst du aus der server.cfg nehmen. Nur das mysql_static.so darf geladen werden.
-
ICy.:
TogglePlayerControllable(playerid,0);
TogglePlayerControllable(playerid,1);
Sonst kann mann sich gar nicht mehr bewegen
Nur, dass bei der Methode eben die einsteigen Animation nicht angezeigt wird. Für manche Server vielleicht nicht wirklich schön.
-
Diese Daten musst du dann in deine Datenbank eintragen, wenn du sie aus der Datenbank laden willst.
Oder du schreibst das ganze System so um, dass es aus diesen Variablen geladen wird. -
Ok, heißt:
Random => Hinten => Random => Hinten => ... => nach 10 Mal Ende. Ja?Und was hat es mit den Schleifen durch die Fahrzeuge auf sich? Muss man in einem der beiden Fahrzeuge sein, um den Checkpoint betreten zu können? Auch den Checkpoint, hinter dem Fahrzeug?
-
Nun gut es funktioniert halbwegs, das neon geht weg, aber wenn ich einschalte kommt es nicht mehr ?

Hast du den Befehl genau so wie ich es dir gegeben habe? Da kann ich das eigentlich nicht nachvollziehen. Kannst du den Befehl mal posten, wie du ihn hast? -
Macht er doch schon.
Zitat[18:27:17] Loading plugin: mysql.so
[18:27:17] Failed (libmysqlclient_r.so.16: cannot open shared object file: No such file or directory)Lade dir das MySQL Plugin nochmal herunter und nutze die mysql_static.so, die hat diese Library bereits inkludiert.
-
Wenn du es nicht als privates Fahrzeug haben willst, dann darfst du keine Datei erstellen. Die lädst du ja beim Server-Start.
