Und scheinbar kann er irgendwas nicht lesen und schmeisst mir 2 Fehler her.
Schalte den Debug Modus an und prüfe, durch welches Query der Fehler ausgegeben wird.
Und scheinbar kann er irgendwas nicht lesen und schmeisst mir 2 Fehler her.
Schalte den Debug Modus an und prüfe, durch welches Query der Fehler ausgegeben wird.
Bsp.: Man geht in eine Fratkion und es werden nur Marker von allen Mitgliedern der Fraktion angezeigt.
Entferne bei beiden Funktionen das GetPlayerColor und das "&".
Schleifen sind Basics, die musst du verstehen. Da führt kein Weg vorbei.
Da ich ab morgen geschäftlich unterwegs bin und bis Freitag nicht dazu kommen werde, weiter zu helfen, hier die Lösung:
forward sekunde1();
public sekunde1()
{
//Deklaration der Variablen. Das macht man außerhalb von Schleifen.
new vehicleid,tmp_engine,tmp_lights,tmp_alarm,tmp_doors,tmp_bonnet,tmp_boot,tmp_objective,string[128],idx;
//Schleife für alle Spieler
for(new i=0; i<MAX_PLAYERS; i++)
{
//Prüfe ob Spieler online und in Fahrzeug. Falls nicht, gehe zum nächsten Spieler
if(!IsPlayerConnected(i) || !IsPlayerInAnyVehicle(i)) continue;
vehicleid = GetPlayerVehicleID(i);
GetVehicleParamsEx(vehicleid, tmp_engine, tmp_lights, tmp_alarm, tmp_doors, tmp_bonnet, tmp_boot, tmp_objective);
//Ist der Motor an?
if(tmp_engine == 1)
{
//Ist noch Benzin im Tank?
if(vehData[vehicleid][e_fuel] < 1)
{
//Nein. Motor abschalten.
tmp_engine = 0;
SetVehicleParamsEx(vehicleid, tmp_engine, tmp_lights, tmp_alarm, tmp_doors, tmp_bonnet, tmp_boot, tmp_objective);
}
else
{
//Ja. Eine Tankeinheit abziehen, wenn der Spieler Fahrer ist.
//Ansonsten ist der Spieler Beifahrer, dann wird nur sein Textdraw aktualisiert.
if(GetPlayerState(i) == PLAYER_STATE_DRIVER)
{
vehData[vehicleid][e_fuel]--;
}
idx = GetVehicleModel(vehicleid)-400;
if(idx < 0) continue;
//Textdraw für Spieler "i" aktualisieren.
format(string, sizeof(string), "%d/%dLiter", vehData[vehicleid][e_fuel],vehDefaultData[idx][e_maxFuel]);
PlayerTextDrawSetString(i, textdraw[5][i], string);
}
}
}
//Schleife für alle Fahrzeuge
for(new i=0; i<MAX_VEHICLES; i++)
{
//Prüfe ob ein Spieler im Fahrzeug als Fahrer ist. Falls ja, dann wurde der Tank bereits verringert, mache nichts.
if(IsAnyDriverInVehicle(i)) continue;
GetVehicleParamsEx(i, tmp_engine, tmp_lights, tmp_alarm, tmp_doors, tmp_bonnet, tmp_boot, tmp_objective);
//Ist der Motor an?
if(tmp_engine == 1)
{
//Ist noch Benzin im Tank?
if(vehData[i][e_fuel] < 1)
{
//Nein. Motor abschalten.
tmp_engine = 0;
SetVehicleParamsEx(i, tmp_engine, tmp_lights, tmp_alarm, tmp_doors, tmp_bonnet, tmp_boot, tmp_objective);
}
else
{
//Ja. Eine Tankeinheit abziehen.
vehData[i][e_fuel]--;
}
}
}
return 1;
}
Die Funktion IsAnyPlayerInVehicle habe ich zu IsAnyDriverInVehicle angepasst, da das geschickter war, um doppelte Abzüge zu verhindern.
stock IsAnyDriverInVehicle(vehicleid)
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerInVehicle(i, vehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER) return 1;
}
return 0;
}
Ich habe dir den Code kommentiert, daran solltest du den Ablauf verstehen.
Bitte arbeite den Code durch und versuche ihn zu verstehen. Kopiere ihn nicht nur in deinen Code.
gibt es ja bei MySQL R41-4 nicht mehr. @Jeffry
Ich könnte ja sagen, ich wollte schauen, ob du auch wirklich ins Wiki schaust
War ein Copy/Paste Fehler, hatte noch die alte Funktion im Zwischenspeicher, sorry. Gut, dass du es trotzdem selbst herausgefunden hast.
PVars sind keine Variablen in dem Sinn.
Das ist mir schon klar, deshalb "Jein"
In gewünschten Fall würde ich mir auch keine Sorgen um die Performance machen, da der Unterschied minimal ist, bei geringer Nutzung.
Die Wiki Seite solltest du doch inzwischen kennen. Dort findest du alle Funktionen und Beispiele dazu.
http://wiki.sa-mp.com/wiki/MySQL/R40
Damit würdest du auch sofort auf die Lösung kommen.
cache_get_value_name_int(0, "GotMD5", GotMD5[playerid]);
Nach der gettime-Zeile ganz oben fehlt:
cache_get_row_count(count);
Du hast vier verschiedene Lösungsansätze hier im Thread, die alle zu dem führen, was du wolltest. "Nicht möglich" trifft es da nicht ganz.
Hast du denn einen davon mal ausprobiert?
Pawn wird ja bekanntlich kompiliert und alle Variablen und Indize müssen zur kompilierzeit bekannt sein.
Jein, bei PVars ist das zum Beispiel nicht notwendig. Diese können frei gefüllt verwendet werden.
So könnte man beispielsweise Items zur Laufzeit aufnehmen, ohne den Code zu verändern.
Schau mal, in der Schleife für MAX_VEHICLES, warum nutzt du da:
new vehicleid = GetPlayerVehicleID(i);
"i" steht bereits für die vehicleid.
Du kannst für "i" keine Spieler-Funktionen nutzen, das klappt dann nicht.
"i" steht für eine beliebige (von 0 bis MAX_VEHICLES-1) vehicleid. Stell dir das immer so vor.
Du machst ja auch nicht folgendes:
new vehicleid = GetPlayerVehicleID(vehicleid);
Somit machst du auch nicht
new vehicleid = GetPlayerVehicleID(i);
wenn du über alle Fahrzeuge iterierst.
Ein weiteres Beispiel das Textdraw:
Du möchtest ja den Tank anpassen, wenn kein Spieler im Fahrzeug sitzt. Warum dann ein Textdraw für einen Spieler anpassen? Es gibt gar keinen Spieler, der das sehen würde.
Du kannst die Schleife auch so schreiben, wenn dir das einfacher verständlich ist:
for(new vehicleid=0; vehicleid<MAX_VEHICLES; vehicleid++)
Generell empfiehlt sich aber "i". Stelle dir einfach vor, alle "i" in der Schleife entsprechen "vehicleid".
Ich weiß, dass der Lösungsweg sehr lange dauert, aber ich möchte, dass du dabei was lernst. Und du lernst das nur, wenn du es selbst machst, nicht wenn ich es dir vorschreibe.
Das sind Basics, die musst du verstehen, sonst kommst du nicht voran.
mysql_format(handle, secondQuery, sizeof(secondQuery), "`TraderPerk`='%d', `Tutorial`='%d', `Cptut`='%d', `kh`='%d', `Warnings`='%d', `Fuel`='%d', `Married`='%d', `MarriedTo`='%s', `WantedLevel`='%d', `Spawn`='%d' WHERE `Name`='%s' ",
PlayerInfo[playerid][pTraderPerk], PlayerInfo[playerid][pTut], PlayerInfo[playerid][pCPTUT], PlayerInfo[playerid][pKHTIME], PlayerInfo[playerid][pWarns],
PlayerInfo[playerid][pFuel], PlayerInfo[playerid][pMarried], PlayerInfo[playerid][pMarriedTo], PlayerInfo[playerid][pWantedLevel], PlayerInfo[playerid][pSpawn], SpielerName(playerid));
zu:
mysql_format(handle, secondQuery, sizeof(secondQuery), "%s`TraderPerk`='%d', `Tutorial`='%d', `Cptut`='%d', `kh`='%d', `Warnings`='%d', `Fuel`='%d', `Married`='%d', `MarriedTo`='%s', `WantedLevel`='%d', `Spawn`='%d' WHERE `Name`='%s' ", secondQuery,
PlayerInfo[playerid][pTraderPerk], PlayerInfo[playerid][pTut], PlayerInfo[playerid][pCPTUT], PlayerInfo[playerid][pKHTIME], PlayerInfo[playerid][pWarns],
PlayerInfo[playerid][pFuel], PlayerInfo[playerid][pMarried], PlayerInfo[playerid][pMarriedTo], PlayerInfo[playerid][pWantedLevel], PlayerInfo[playerid][pSpawn], SpielerName(playerid));
mysql_pquery(handle, mainQuery, "", "");
print(mainQuery);
zu:
mysql_pquery(handle, secondQuery, "", "");
print(secondQuery);
switch(random(3))
{
case 0:
{
//Marker 1
}
case 1:
{
//Marker 2
}
case 2:
{
//Marker 3
}
}
Nutze: http://wiki.sa-mp.com/wiki/MySQL/R40#mysql_pquery
Prinzipiell einfach mysql_format mit mysql_pquery ersetzen und das true, entfernen.
if(mysql_CheckAccount(playerid))
Entferne diese Abfrage in OnAccountChecked.
SetTimerEx("OnAccountChecked",200,0,"i",playerid);
Ersetze das mit:
mysql_CheckAccount(playerid);
Leider ist es nicht möglich ein Video zu machen.
Wieso das?
Ich bin der Meinung das es an sscanf liegt, da es noch keine Version für 0.3DL gibt.
Das halte ich eher für unwahrscheinlich, sscanf hat nichts mit Objekten zu tun.
Klappt es denn, wenn du die "DestroyDynamicObject" in dem Befehl mal auskommentierst?
Warum funktioniert das so nicht?
Er liest die Acc´s nicht aber wen ich SetConnect nutze funktioniert das...
Wie sieht das Query aus, welches OnAccountChecked aufruft?
Eine Andere Frage wie kann ich die Regestrierung von 0 UHR bis 8 UHR Automatisch schließen.?
new hour, minute, second;
gettime(hour, minute, second);
if(hour < 8) return SendClientMessage(playerid, 0xFF0000FF, "Die Registrierung ist zwischen 0 und 8 Uhr nicht möglich.");
Das läuft ja so schon nur über den Spieler, also wenn ich nicht im Fahrzeug bin und der Motor an ist passiert gar nichts.
Kriege das nicht so ganz hin, ich weiß das es so falsch ist zumindest aber welcher Code gehört jetzt nach MAX_PLAYERS
Die erste Schleife für alle Spieler muss genau so sein, wie in Post #27, das war da ja schon richtig.
Plus die Abfragen, die du mit Post #30 rein gebaut hast.
In die zweite Schleife für MAX_VEHICLES muss das rein, vom Ablauf her, daran kannst du dich entlang hangeln:
Nach der ersten Schleife für MAX_PLAYERS eine zweite Schleife für MAX_VEHICLES.
Darin ist "i" dann die vehicleid so gesehen.
Dann für "i" prüfen, ob ein Spieler in diesem Auto sitzt, wenn ja, nichts machen.
Sitzt keiner drin, dann prüfen ob der Motor für "i" an ist.
Wenn ja, dann eine Tankeinheit von "i" abziehen.
wie baue ich das mit else if rein? Folgender ERROR kommt: error 001: expected token: "*then", but found ";"
if(strcmp("/loadbenzin", cmdtext, true) == 0)
{
if(IsPlayerInRangeOfPoint(playerid, 7.0, 260.0804,1371.4133,10.4647))
{
ShowPlayerDialog(playerid, DIALOG_LOADBENZIN, DIALOG_STYLE_LIST, "Loadbenzin", "1000 Liter\n5000 Liter\n8000 Liter", "Einladen", "Abbrechen");
}
else
{
SendClientMessage(playerid,0xAA3333AA,"Du bist nicht in der Nähe!");
}
return 1;
}
Du hast die Schleifen jetzt ineinander gesetzt, nicht nacheinander.
Nacheinander heißt, dass nach der letzten geschweiften Klammer Zu der Schleife, auf gleicher Ebene wieder eine Schleife beginnt.
Beispiel in Pseudo Code:
for(alle Spieler)
{
//Code für alle Spieler
}
for(alle Fahrzeuge)
{
//Code für alle Fahrzeuge
}
Dann hat der Compiler auch kein Problem damit, dass du beides mal i verwendest.
Nutzt du das Streamer Plugin?
Könntest du von dem Problem bitte mal ein Video machen, damit man sich das besser vorstellen kann, wie es aussieht?
Kannst du mir eventuell helfen?
Sieht so aus, als wird das OnPlayerCommandText Callback gar nicht aufgerufen. Ist der Code geladen? Wenn ja, nutzt du einen Command Prozessor wie z.B. ocmd, zcmd, dcmd, etc...?