Hallo,
ich hab mir ein ganz einfaches Motor System gescriptet mit OnPlayerKeyStateChange und KEY_CROUCH.
Hier mein Code:
if(newkeys & KEY_CROUCH)
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
SendClientMessage(playerid, COLOR_YELLOW, "Du musst der Fahrer des Wagens sein!");
}
else
{
if(Engine[GetPlayerVehicleID(playerid)] == 0)
{
TogglePlayerControllable(playerid, 1);
Engine[GetPlayerVehicleID(playerid)] = 1;
MinusBenzin = SetTimer("MinusFuel", 20000, 1);
SendClientMessage(playerid, COLOR_YELLOW, "Der Motor läuft und du kannst fahren!");
}
else if(Engine[GetPlayerVehicleID(playerid)] == 1)
{
TogglePlayerControllable(playerid, 0);
Engine[GetPlayerVehicleID(playerid)] = 0;
KillTimer(MinusBenzin);
SCM(playerid, COLOR_YELLOW, "Der Motor ist aus und du kannst das Fahrzeug mit /exit verlassen");
}
}
}
Wenn ich jetzt "c" drücke Springt der Motor ja auch an aber wenn ich wiederholt "c" drücke geht er nicht mehr aus, es passiert nichts. Das kann ich so oft machen wie ich will der Motor bleibt an und nichts ändert sich.
Pls Help. Der motor soll nach wiederholtem Drücken von "c" ausgehen".
V1rus
-
-
else
zu
else if -
Code technisch müsste das aber zum gleichen Resultat führen, deswegen glaube ich kaum, dass eine Änderung der if/else einen Unterschied macht. Kann es sein, dass irgendwas mit der Timer Funktion nicht stimmt?
-
Der Timer hat nichts mit dem Motor System zu tun, sondern mit dem Tank System.
Wenn ich else zu else if mache bekomme ich Errors. Du meinst das else nach dem If(IsPlayerInAnyVehicle(playerid)) oder? -
Deine Timer Funktion könnte aber das Resultat für nicht korrekt ausgeführten Code sein, ich würde es nicht ansprechen wenn es gänzlich unrealistisch wäre ;).
Anstelle deines Codes kannst du die else if Verknüpfung wie folgt schreiben:
Code
Alles anzeigenif(newkeys & KEY_CROUCH) { if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) { SendClientMessage(playerid, COLOR_YELLOW, "Du musst der Fahrer des Wagens sein!"); } else if(Engine[GetPlayerVehicleID(playerid)] == 0) { TogglePlayerControllable(playerid, 1); Engine[GetPlayerVehicleID(playerid)] = 1; MinusBenzin = SetTimer("MinusFuel", 20000, 1); SendClientMessage(playerid, COLOR_YELLOW, "Der Motor läuft und du kannst fahren!"); } else if(Engine[GetPlayerVehicleID(playerid)] == 1) { TogglePlayerControllable(playerid, 0); Engine[GetPlayerVehicleID(playerid)] = 0; KillTimer(MinusBenzin); SCM(playerid, COLOR_YELLOW, "Der Motor ist aus und du kannst das Fahrzeug mit /exit verlassen"); } }
Das macht aber von der Logik keinen Unterschied.
-
Nope funzt nicht auch wenn ich den Timer rausnehme....
//Edit es hat doch bestimmt jemand ne idee
-
Also was mich frägelt, obwohl dein Code total in Ordnung ist Chefe ^^, dieser folgende Auschnitt bei deinem ersten Post:
else if(Engine[GetPlayerVehicleID(playerid)] == 1)Du meintest ja, dass er nicht mehr ausgeht. Man kann also davon ausgehen das die Variable Engine irgendwo wieder umgeändert wird auf eine andere Zahl und somit dein Code nicht ausgeführt werden kann ^^. Zum Testen probiere folgendes:
if(newkeys & KEY_CROUCH)
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
SendClientMessage(playerid, COLOR_YELLOW, "Du musst der Fahrer des Wagens sein!");
}
else
{
if(Engine[GetPlayerVehicleID(playerid)] == 0)
{
TogglePlayerControllable(playerid, 1);
Engine[GetPlayerVehicleID(playerid)] = 1;
MinusBenzin = SetTimer("MinusFuel", 20000, 1);
SendClientMessage(playerid, COLOR_YELLOW, "Der Motor läuft und du kannst fahren!");
}
else
{
TogglePlayerControllable(playerid, 0);
Engine[GetPlayerVehicleID(playerid)] = 0;
KillTimer(MinusBenzin);
SCM(playerid, COLOR_YELLOW, "Der Motor ist aus und du kannst das Fahrzeug mit /exit verlassen");
}
}
}Was mir jedoch noch auffällt, dass MinusBenzin Spieler spezifisch sein sollte, weil du ansonsten global den Timer ausschaltest ^^, also einfach
new MinusBenzin[MAX_PLAYERS];
die Funktion MinuesFuel sollte dann auch Spielerspezifisch sein, weil es einen totalen Schwachsinn auspuckt wenn mehrere Spieler auf den Server kommen!
forward MinusFuel(playerid);
public MinusFuel(playerid)
{
//Code...
}und die richtige Verwendung wäre dann:
if(newkeys & KEY_CROUCH)
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
SendClientMessage(playerid, COLOR_YELLOW, "Du musst der Fahrer des Wagens sein!");
}
else
{
if(Engine[GetPlayerVehicleID(playerid)] == 0)
{
TogglePlayerControllable(playerid, 1);
Engine[GetPlayerVehicleID(playerid)] = 1;
MinusBenzin[playerid] = SetTimerEx("MinusFuel", 20000, 1, "d", playerid);
SendClientMessage(playerid, COLOR_YELLOW, "Der Motor läuft und du kannst fahren!");
}
else
{
TogglePlayerControllable(playerid, 0);
Engine[GetPlayerVehicleID(playerid)] = 0;
KillTimer(MinusBenzin[playerid]);
SCM(playerid, COLOR_YELLOW, "Der Motor ist aus und du kannst das Fahrzeug mit /exit verlassen");
}
}
} -
Danke Templer, aber auch das funktioniert nicht
Sonst jemand ne Idee? -
hmm... also wenn das von Templer nicht funktioniert, da weis auch ich nicht weiter
-
Es gibt einen mMn echt dummen Ansatz um das jetzt auf die simpelste Weise zu debuggen. Das machste aber nur wenn du allein auf dem Server bist:
Code
Alles anzeigenif(newkeys & KEY_CROUCH) { print("Debug: Pressed Crouch"); if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) { SendClientMessage(playerid, COLOR_YELLOW, "Du musst der Fahrer des Wagens sein!"); } else { print("Debug: Else Cause - Start"); if(Engine[GetPlayerVehicleID(playerid)] == 0) { print("Debug: If Statement - Start"); TogglePlayerControllable(playerid, 1); Engine[GetPlayerVehicleID(playerid)] = 1; MinusBenzin[playerid] = SetTimerEx("MinusFuel", 20000, 1, "d", playerid); SendClientMessage(playerid, COLOR_YELLOW, "Der Motor läuft und du kannst fahren!"); print("Debug: If Statement - End"); } else { print("Debug: Else Statement - Start"); TogglePlayerControllable(playerid, 0); Engine[GetPlayerVehicleID(playerid)] = 0; KillTimer(MinusBenzin[playerid]); SCM(playerid, COLOR_YELLOW, "Der Motor ist aus und du kannst das Fahrzeug mit /exit verlassen"); print("Debug: Else Statement - End"); } } }
Wenn ich mal wirklich an nem Punkt angelangt bin an dem ich nicht mehr weiterweiß, debugge ich Abschnitt für Abschnitt. Dann kannst in deine server_log (linux) oder windowsbox gucken was geprinted wird. Falls das zu erwarten geprintet wird kannst auch noch eine Stufe tiefer gehen und dir alle Variablen anzeigen lassen bis du weißt was falsch ist.
Das ist kein guter programmiertechnischer Ansatz aber wenn alles andere nicht hilft... was will man dann machen.
-
Danke ray, aber ich bekomme es einfach nicht hin, dass
else
{
print("Debug: Else Statement - Start");
TogglePlayerControllable(playerid, 0);
Engine[GetPlayerVehicleID(playerid)] = 0;
KillTimer(MinusBenzin[playerid]);
SCM(playerid, COLOR_YELLOW, "Der Motor ist aus und du kannst das Fahrzeug mit /exit verlassen");
print("Debug: Else Statement - End");
}
dieser Code ausgeführt wird. Ich hab jetzt alles probiert was mit eingefallen ist.
Pls Help
V1rus -
-
Das glaube ich kaum.
@Virus: Wird "Debug: Pressed Crouch" ausgegeben, "Debug: Else Cause - Start" aber nicht? Wird dafür dann auf dem Server SendClientMessage(playerid, COLOR_YELLOW, "Du musst der Fahrer des Wagens sein!"); ausgeführt?
Kommentier mal alles unnötige an Funktionen aus sodass nur noch
Engine[GetPlayerVehicleID(playerid)] = 1;
SendClientMessage(playerid, COLOR_YELLOW, "Der Motor läuft und du kannst fahren!");im if Statement steht.
Wie hast du deine Engine Variable angelegt? Mit MAX_VEHICLES? Ich habe ähnliches Verhalten schon beobachtet wenn man das Array überschreitet, sprich Engine hat 200 cells, deine VehicleID ist aber >=200.
-
Ja, ich habe es mit MAX_VEHICLES angelegt. Oder gibt es eine andere Möglichkeit?
-
Gibts schon, is aber vollkommen richtig so.
Wie gesagt Kommentier mal alles im if/else statement aus was nicht nötig ist. Und antworte auf meine restlichen fragen
-
Mit KEY_ANALOG_LEFT gehts.
Aber ray187 ich habs rausgefunden an was es liegt nur kann ich damit das Problem nicht lösen weils komisch ist.
if(newkeys & KEY_CROUCH)
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
SendClientMessage(playerid, COLOR_YELLOW, "Du musst der Fahrer des Wagens sein!");
}
else
{
if(Engine[GetPlayerVehicleID(playerid)] == 0)
{
TogglePlayerControllable(playerid, 1); // <--- Wenn ich diese Funktion auskommentiere Funktioniert alles! Man kann aber nicht los fahren, weil man ja gefreezed ist weil der Motor aus ist!
Engine[GetPlayerVehicleID(playerid)] = 1;
MinusBenzin[playerid] = SetTimerEx("MinusFuel", 20000, 1, "d", playerid);
SendClientMessage(playerid, COLOR_YELLOW, "Der Motor läuft und du kannst fahren!");
}
else
{
TogglePlayerControllable(playerid, 0);
Engine[GetPlayerVehicleID(playerid)] = 0;
KillTimer(MinusBenzin[playerid]);
SCM(playerid, COLOR_YELLOW, "Der Motor ist aus und du kannst das Fahrzeug mit /exit verlassen");
}
}
} -
Hm das hab ich auch noch nie gehört, naja gut
-
Das liegt daran, dass nicht alle Tasten für sowas kompatibel sind aus welchem Grund auch immer.
Bei mir ging es ganz gut mit der Leertaste, sprich KEY_HANDBRAKE.
ZitatDas glaube ich kaum.
Doch der ICE AGE Fan hat aber recht -
Ich habs aber selbst schon erfolgreich gemacht, aber es liegt anscheinend wirklich daran - verrückt.
-
Okay Danke euch Aber ein Problem noch:
if(newkeys & KEY_HANDBRAKE)
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
SendClientMessage(playerid, COLOR_YELLOW, "Du musst der Fahrer des Wagens sein!");
}
else
{
if(Engine[GetPlayerVehicleID(playerid)] == 0)
{
Engine[GetPlayerVehicleID(playerid)] = 1;
MinusBenzin[playerid] = SetTimerEx("MinusFuel", 20000, 1, "d", playerid);
SendClientMessage(playerid, COLOR_YELLOW, "Der Motor läuft und du kannst fahren!");
TogglePlayerControllable(playerid, 1);
}
else
{
Engine[GetPlayerVehicleID(playerid)] = 0;
KillTimer(MinusBenzin[playerid]);
SCM(playerid, COLOR_YELLOW, "Der Motor ist aus und du kannst das Fahrzeug mit /exit verlassen");
TogglePlayerControllable(playerid, 0);
}
}
}
Wenn ich dan Leertaste drücke passiert garnichts// Edit: Passt hab jetzt KEY_WALK genommen!