Hier wird doch der Motor aus gemacht?
Stimmt, das habe ich nicht gesehen, mein Fehler, sorry.
Das Problem liegt hier:
if(vehData[vehicleid][e_fuel] <= 0)
Zu
if(vehData[i][e_fuel] <= 0)
Hier wird doch der Motor aus gemacht?
Stimmt, das habe ich nicht gesehen, mein Fehler, sorry.
Das Problem liegt hier:
if(vehData[vehicleid][e_fuel] <= 0)
Zu
if(vehData[i][e_fuel] <= 0)
if(strcmp(Kraftstoff), mInfo[vModel][fuelTyp]){
Zu
if(!strcmp(Kraftstoff, mInfo[vModel][fuelTyp])){
Das kann durch diesen Code aber nicht passieren, da du in der VEHICLE Schleife den Motor ja nirgends aus machst.
Hast du eventuell noch einen anderen Code, der den Motor automatisch aus macht, wenn kein Spieler im Fahrzeug ist?
Du musst die Codes unter den jeweiligen cases auch in gschweifte klammern packen, gleich wie bei einem if zum Beispiel.
Das new string darf nicht zwischen switch und case stehen. Entweder in einem case oder vor dem switch.
Beim format fehlt hinten noch das Anführungszeichen.
if(Drugs[playerid] == <1)
Zu
if(Drugs[playerid] >= 1)
Und
else if(Drugs[playerid] == >1)
Zu
else
Nur wenn ich nicht im Fahrzeug wird beim Nächten eigentlichen Abzug das Fahrzeug ausgeschaltet.
Was meinst du?
Gerne!
Und wie gesagt, nehme dir das Thema mit der Weitergabe des Schlüssels für später irgendwann vor, wenn du etwas länger auch mit dem System gearbeitet hast und eventuell auch noch weitere Dinge eingebaut hast.
Mit der Zeit kommt da die Erfahrung und du hast dann auch schneller Ideen, wie du das in deinem Code am besten und geschicktesten umsetzen kannst.
weil wenn man die bei pawno eingibt und dann eine Klammer auf macht, kommt keine Parameter liste^^
Das liegt daran, dass die Funktion den "Float" Tag davor hat, das klappt dann mit pawno nicht mehr.
Also wenn ich mich nicht täusche, und ich es richtig getest habe, dann bist du ein Schatz xD
Super!
PS:
Bitte mache keine Zitate vom ganzen Post mit dem ganzen Code darin, das macht keinen Sinn und sieht völlig chaotisch aus.
Okay... Also leider hast du nen minimalen Denkfehler GetKilometers gibt es nicht mehr (include ist ja raus^^)
Oh, natürlich, das habe ich übersehen:
forward setKiloMeter();
public setKiloMeter()
{
printf("Call: %d", gettime());
new Float:km;
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i) || !pInfo[i][pLoggedIn])continue;
if(GetPlayerState(i) != PLAYER_STATE_DRIVER) continue;
new vID = GetPlayerVehicleID(i);
if(!vID) continue;
printf("vID: %d, Motor: %d", vID, motor[vID]);
if(motor[vID] == 0 || motor[vID] == -1) continue;
km = GetVehicleDistanceFromPoint(vID, v_oldPos[vID][0], v_oldPos[vID][1], v_oldPos[vID][2]) * 0.001;
if(km > 0)
{
kmstand[vID] += km;
printf("vID: %i, Total: %0.2f, Add: %0.2f, i: %i", vID, kmstand[vID], km, i);
setVehicleKM(i, vID);
GetVehiclePos(vID, v_oldPos[vID][0], v_oldPos[vID][1], v_oldPos[vID][2]);
}
}
return 1;
}
Mein OnPlayerStateChange sieht nun so aus... ist das so richtig?:
Ja, das sollte passen.
Ich habe mir die Include grade mal angeschaut. Der Fehler liegt dort. Selbstverständlich werde ich auf diese auch nicht mehr verweisen.
Die Include funktioniert nur mit einem Fahrzeug. Ich spare mir, diese umzuschreiben, da dein Timer das meiste schon von sich erledigen kann:
Wirf bitte die Include aus deinem Code und versuche folgendes:
Unter den Includes:
new Float:v_oldPos[MAX_VEHICLES][3];
Timer:
forward setKiloMeter();
public setKiloMeter()
{
printf("Call: %d", gettime());
new Float:km;
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i) || !pInfo[i][pLoggedIn])continue;
if(GetPlayerState(i) != PLAYER_STATE_DRIVER) continue;
new vID = GetPlayerVehicleID(i);
if(!vID) continue;
printf("vID: %d, Motor: %d", vID, motor[vID]);
if(motor[vID] == 0 || motor[vID] == -1) continue;
if(GetKilometers(vID) > 0)
{
km = GetVehicleDistanceFromPoint(vID, v_oldPos[vID][0], v_oldPos[vID][1], v_oldPos[vID][2]) * 0.001;
kmstand[vID] += km;
printf("vID: %i, Total: %0.2f, Add: %0.2f, i: %i", vID, kmstand[vID], km, i);
setVehicleKM(i, vID);
GetVehiclePos(vID, v_oldPos[vID][0], v_oldPos[vID][1], v_oldPos[vID][2]);
}
}
return 1;
}
OnPlayerStateChange:
if(newstate == PLAYER_STATE_DRIVER)
{
new vID = GetPlayerVehicleID(playerid);
if(vID) GetVehiclePos(vID, v_oldPos[vID][0], v_oldPos[vID][1], v_oldPos[vID][2]);
}
[12:11:24] vID: 3, Total: 3.21, Add: 0.05, i: 1
Und ab hier bist du wieder weitergefahren?
Kannst du es bitte hiermit nochmals testen:
forward setKiloMeter();
public setKiloMeter()
{
printf("Call: %d", gettime());
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i) || !pInfo[i][pLoggedIn])continue;
if(GetPlayerState(i) != PLAYER_STATE_DRIVER) continue;
new vID = GetPlayerVehicleID(i);
if(!vID) continue;
printf("vID: %d, Motor: %d", vID, motor[vID]);
if(motor[vID] == 0 || motor[vID] == -1) continue;
if(GetKilometers(vID) > 0)
{
kmstand[vID] += GetKilometers(vID);
printf("vID: %i, Total: %0.2f, Add: %0.2f, i: %i", vID, kmstand[vID], GetKilometers(vID), i);
setVehicleKM(i, vID);
ResetMetersTraveled(vID);
}
}
return 1;
}
Bitte auch etwas länger für den zweiten User.
Aufhängen sollte sich der Server dadurch eigentlich nicht.
Du startest den Timer auch wirklich nur noch unter OnGameModeInit?
Gut erklärt, ich verstehe das Problem, kann es nur am Code nicht wirklich nachvollziehen.
Kannst du es bitte mal so schreiben:
forward setKiloMeter();
public setKiloMeter()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i) || !pInfo[i][pLoggedIn])continue;
if(GetPlayerState(i) != PLAYER_STATE_DRIVER) continue;
new vID = GetPlayerVehicleID(i);
if(vID && GetKilometers(vID) > 0)
{
kmstand[vID] += GetKilometers(vID);
printf("%d / vID: %i, Total: %0.2f, Add: %0.2f, i: %i", GetTickCount(), vID, kmstand[vID], GetKilometers(vID), i);
setVehicleKM(i, vID);
ResetMetersTraveled(vID);
}
}
return 1;
}
Was wird dann im Log geprintet, wenn du obigen Fehlerfall nochmal durchspielst?
ich lade die Tankstellen für jeden Spieler unter OnPlayerConnect
Dann musst du die Anzahl eintragen, da der Code ja nicht weiß, wie viele Tankstellen du lädst. Der Speicher muss vorher (beim Compilen) reserviert werden.
Außerdem musst du es bei OnGameModeInit laden, sonst werden die Pickups etc für jeden Spieler nochmal erstellt.
Die Schleife dann so:
for(new i = 0; i < sizeof(tInfo); i++)
Ja du hast Recht, ich bin auch der Meinung ich komme mehr zurecht auch wenn man es vielleicht nicht so sehen kann.
Natürlich, das entwickelt sich mit der Zeit. Deine Systeme solltest du immer so aufbauen, dass zuerst das Grundgerüst steht und funktioniert. Solche zusätzlichen Funktionen macht man dann später, da diese oft weitaus mehr Aufwand bedeuten. (~ 20% Aufwand für die ersten 80% des Systems, und 80% Aufwand für die restlichen 20% des Systems).
Hier wid doch gefragt ob M_ID == 0 ist fals ja macht er weiter oder nicht?
continue heißt, gehe sofort zum nächsten Schleifendurchlauf.
Sprich, wenn die MID 0 ist, dann geht er sofort zum nächsten "i", ohne das Query auszuführen.
also musst ich bestimmt noch bei tInfo[][ENUMDATA] eine Zahl einfügen: tInfo[50][VEHDATA] oder?
Stehen die Werte fest im Code im Array, oder lädst du diese irgendwo extern her?
Wenn sie fest drin stehen, dann brauchst du keine Zahl eintragen.
Hast du eventuell eine Meldung bezüglich stack/heap size im Compiler (oder Warnungen)?
Immerhin sollen ja nur KM gezählt werden, sobald der Motor an ist... Versteh ich irgendwas falsch ?
Das stimmt schon, nur hast du im Callback eine Schleife durch alle Spieler. Hast du den Timer jetzt für mehrere Spieler gestartet, dann wird das alles mehrmals für alle Spieler gemacht.
Das Callback sollte so aussehen:
forward setKiloMeter();
public setKiloMeter()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i) || !pInfo[i][pLoggedIn])continue;
if(GetPlayerState(i) != PLAYER_STATE_DRIVER) continue;
new vID = GetPlayerVehicleID(i);
if(vID && GetKilometers(vID) > 0)
{
printf("%i, %0.2f", vID, kmstand[vID]);
kmstand[vID] += GetKilometers(vID);
setVehicleKM(playerid, vID);
ResetMetersTraveled(vID);
}
}
return 1;
}
Und dann kannst du den Timer bei OnGameModeInit starten:
SetTimer("setKiloMeter", 1000, true);
Sonst bitte nirgends.
Dann brauchst du ihn auch nirgends beenden.
Nutze OnPlayerEnterDynamicCP.
https://github.com/samp-incogn…mer-plugin/wiki/Callbacks
Dann kannst du das IsPlayerInDynamicCP mit einer Abfrage gegen die checkpointid ändern.
Nutze dann außerdem if, else if, else if,... anstatt nur if, if, if. Der Spieler kann ja nur in einem Checkpoint sein.
Außerdem darfst du nur ein Array für die Checkpoint ID nehmen, in die schreibst du immer den Checkpoint rein, der erstellt wird. Ein zweites Array nimmst du, um den Schritt (1, 2, 3,...) rein zu schreiben, damit kannst du dann Abfragen, bei welchem Schritt der Spieler grade ist.
Er zeigt mir Ingame zahlen an wie z:b 66 oder 68
Nutze %s da du einen String anzeigst.
Ich weiß halt nur nicht wie ich das alles im Code umsetzte, es ist auch schwierig.
Ich rate dir, erst mal an den weiteren Systemen zu arbeiten, Erfahrung zu sammeln, und dann daran weiter zu machen, wenn du eine Idee hast, wie du es in deinen gesamten Code integrieren kannst.
Ändere die beiden
[e_fuel]--;
zu:
[e_fuel] -= 0.01;