Motorschaden Bug

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,
    wie die Überschrift schon verrät habe ich einen Bug im Motorschaden System.


    forward VehicleHealth(playerid);


    OnGameModeInit:
    SetTimer("VehicleHealth", 6000, 1);


    forward VehicleHealth(playerid);
    public VehicleHealth(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    new Float:health;
    new veh = GetPlayerVehicleID(playerid);
    GetVehicleHealth(veh, health);
    if(health > 400)
    {
    SendClientMessage(playerid,0xFF0000FF,"Du hast einen Motorschaden!");
    return 1;
    }
    }
    }


    Kriege leider immer diesen Error:
    (51227) : error 030: compound statement not closed at the end of file (started at line 51212)


    Zeile:
    if(IsPlayerConnected(playerid))


    Zeile 2:
    Nicht vorhanden!


    Würde mich sehr um eine positive Antwort freuen, wie ich das beheben kann.


    Liebe Grüße,
    Soldier

  • Wieso hat der Callback VehicleHealth einen Parameter "playerid" ?


    Du nutzt bei OnGameModeInit SetTimer und das ist Global, da müsstest du ne Schleife drum machen.
    Oder du macht SetTimerEx welches für jeden Spieler einzeln ist.



    ____


    Am besten einfach mal den Parameter entfernen und eine for-loop im Callback schreiben.


    //edit
    Code Part:

    Spoiler anzeigen

    forward VehicleHealth();
    public VehicleHealth()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(IsPlayerInAnyVehicle(i))
    {
    new Float:health;
    new veh = GetPlayerVehicleID(i);
    GetVehicleHealth(veh, health);
    if(health > 400)
    {
    SendClientMessage(i,0xFF0000FF,"Du hast einen Motorschaden!");
    return 1;
    }
    }
    }
    }

    MFG

  • Schlichtweg ein Klammerfehler.
    Außerdem brauchst du die Schleife:


    forward VehicleHealth();
    public VehicleHealth()
    {
    for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
    {
    if(IsPlayerConnected(playerid))
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    new Float:health;
    new veh = GetPlayerVehicleID(playerid);
    GetVehicleHealth(veh, health);
    if(health > 400)
    {
    SendClientMessage(playerid,0xFF0000FF,"Du hast einen Motorschaden!");
    }
    }
    }
    }
    return 1;
    }


    Du musst dir aber im Klaren darüber sein, dass die Nachricht jede Sekunde kommt, du brauchst also noch eine Variable, die du auf 1 setzt, wenn die Nachricht das erste mal kam.

  • Danke Jeffry:
    1 Frage noch, wie Frage ich ab ob der einen Motorschaden hat?
    denn dann soll der Motor nicht mehr starten können


    if(strcmp(cmd, "/motor",true) == 0)
    {
    if(IsANoTachoVehicle(GetPlayerVehicleID(playerid)))
    {
    SendClientMessage(playerid, COLOR_GRAD1, "{FFFFFF}Fahrräder haben {FF0000}keinen{FFFFFF} Motor ...");
    return 1;
    }
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return 1;
    new engine,lights,alarm,doors,bonnet,boot,objective;
    new vid = GetPlayerVehicleID(playerid);
    GetVehicleParamsEx(vid,engine,lights,alarm,doors,bonnet,boot,objective);
    if(vid != INVALID_VEHICLE_ID)
    {
    if(engine == VEHICLE_PARAMS_ON)
    {
    SetVehicleParamsEx(vid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~W~Motor ~r~aus!", 2000, 5);
    OnPlayerCommandText(playerid,"/me stellt den Motor ab!");
    }
    else
    {
    SetVehicleParamsEx(vid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~W~Motor ~g~an!", 2000, 5);
    OnPlayerCommandText(playerid,"/me betätigt die Zündung. Der Motor springt an!");
    }
    }
    return 1;
    }

  • Unter die Includes:
    new mSchaden[MAX_PLAYERS];


    forward VehicleHealth();
    public VehicleHealth()
    {
    for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
    {
    if(IsPlayerConnected(playerid))
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    new Float:health;
    new veh = GetPlayerVehicleID(playerid);
    GetVehicleHealth(veh, health);
    if(health > 400 && mSchaden[playerid] == 0)
    {
    mSchaden[playerid] = 1;
    SendClientMessage(playerid,0xFF0000FF,"Du hast einen Motorschaden!");
    }
    }
    }
    }
    return 1;
    }


    Und beim Befehl:
    if(mSchaden[playerid] == 1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Motoschaden!");

  • Stimmt das so? Jeffry:
    Wenn ich los fahre, steht da sofort: Error Motorschaden..


    if(strcmp(cmd, "/motor",true) == 0)
    {
    if(IsANoTachoVehicle(GetPlayerVehicleID(playerid)))
    {
    SendClientMessage(playerid, COLOR_GRAD1, "{FFFFFF}Fahrräder haben {FF0000}keinen{FFFFFF} Motor ...");
    return 1;
    }
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return 1;
    new engine,lights,alarm,doors,bonnet,boot,objective;
    new vid = GetPlayerVehicleID(playerid);
    GetVehicleParamsEx(vid,engine,lights,alarm,doors,bonnet,boot,objective);
    if(mSchaden[playerid] == 1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Motoschaden!");
    if(vid != INVALID_VEHICLE_ID)
    {
    if(engine == VEHICLE_PARAMS_ON)
    {
    SetVehicleParamsEx(vid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~W~Motor ~r~aus!", 2000, 5);
    OnPlayerCommandText(playerid,"/me stellt den Motor ab!");
    }
    else
    {
    SetVehicleParamsEx(vid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~W~Motor ~g~an!", 2000, 5);
    OnPlayerCommandText(playerid,"/me betätigt die Zündung. Der Motor springt an!");
    }
    }
    return 1;
    }

  • Achso öhm xD
    Naja dies funktioniert zwar, aber wenn ich in ein anderes Auto steige, das 1000 Zustand hat, hat es trz ein Motorschaden. (dies tretet nur auf, wenn ich zuvor einen Motorschaden hatte an einem anderen Fahrzeug.)
    Was soll ich tun?

  • Okay danke Jeffry :D
    Hab eine Frage, was habe ich da falsch gemacht?
    if(strcmp(cmdtext, "/repair", true) == 0)
    {
    if(GetPlayerMoney(playerid)>=10000)
    {
    GivePlayerMoney(playerid,-10000);
    }
    else
    SendClientMessage(playerid,COLOR_RED,"Um Dein Auto zu reparieren brauchst du 10.000$!");
    return 1;
    }
    {
    SendClientMessage(playerid, 0x6CAFF9FF, "Du hast dein Auto Repariert!");
    SetVehicleHealth(GetPlayerVehicleID(playerid), 1000);
    new X;
    new Y;
    new Z;
    PlayerPlaySound(playerid,1057,X,Y,Z);
    GivePlayerMoney(playerid, -10000);
    return 1;
    }
    Jeffry:

    2 Mal editiert, zuletzt von xSoldier ()

  • Klammersetzung und der ganze Aufbau passt nicht.


    So ist es besser:
    if(strcmp(cmdtext, "/repair", true) == 0)
    {
    if(GetPlayerMoney(playerid)<10000) return SendClientMessage(playerid,COLOR_RED,"Um Dein Auto zu reparieren brauchst du 10.000$!");
    SendClientMessage(playerid, 0x6CAFF9FF, "Du hast dein Auto Repariert!");
    SetVehicleHealth(GetPlayerVehicleID(playerid), 1000);
    PlayerPlaySound(playerid,1057,0,0,0);
    GivePlayerMoney(playerid, -10000);
    return 1;
    }

  • Jeffry: Du setzt die Variable mSchaden für den Player, ist es nicht besser es für das Vehicle zu setzen?

  • In diesem Fall ist es relativ egal.
    Wenn man aber Vehicles auch entfernt und wieder erstellt, muss man das jedes mal zurücksetzen, und immer die Vehicle ID abfragen, das kann schneller zu Fehler führen. Leichter und ressourcenschonender ist es hier mit dem Spieler zu arbeiten, anstatt dem Fahrzeug.