Motor System geht nicht

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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

  • 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?

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • 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:



    Das macht aber von der Logik keinen Unterschied.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • Nope funzt nicht auch wenn ich den Timer rausnehme....


    //Edit es hat doch bestimmt jemand ne idee

    Einmal editiert, zuletzt von v1rus ()

  • 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");
    }
    }
    }

    Mfg Templer


    >>Dein Breadfish-Thema im Unterforum ScriptingBase / Scriptingwünsche wurde nicht richtig beantworter?<<
    >>Es handelt sich um ein Programmier Problem und du nicht einfach weiter kommst wo der Fehler sein könnte?<<
    Dann melde dich bei mir über die PN-Funktion indem du den Link zu deinem Breadfish-Themen Problem schickst.
    Voraussetzung:
    Thema älter als 1 Tag und im Breadfish Forum gespostet!

  • Danke Templer, aber auch das funktioniert nicht ;(
    Sonst jemand ne Idee?

    Einmal editiert, zuletzt von v1rus ()

  • 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:



    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.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • 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.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • 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 ^^

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • 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 ;)

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • 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.



    Zitat

    Das 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.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • 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!

    Einmal editiert, zuletzt von V1rus ()