Problem mit meinem Script?

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 habe derzeit ein Problem welches sich nicht behebe lässt.
    Manche Befehle funktionieren nicht, obwohl Sie richtig geschrieben sind. Fraktion 1 kann z.B den Befehl nutzen, Fraktion 3 wird der Befehl als nicht vorhanden angezeigt.


    Vielleicht hilft euch dieser Public?
    public OnPlayerCommandPerformed(playerid, cmdtext[], success)
    {
    return SendClientMessage(playerid, COLOR_WHITE, "Der eingegebene Befehl wurde nicht gefunden. Bitte verwende {33AA33}/help");
    }

  • Eine Meldung ist nicht im Compiler, nur das Copyright.
    Hier mal der Befehl:
    CMD:department(playerid, params[])
    {
    if(!IsLoggedIn(playerid))return 1;
    new text[96], string[128];
    if(sscanf(params, "s[96]", text))return SendClientMessage(playerid, COLOR_GREY, "** Benutze (/d)epartment [Nachricht]");
    if(!(Spieler[playerid][pFraktion] == 1 || Spieler[playerid][pFraktion] == 3))return SendClientMessage(playerid, COLOR_GREY, "** Du bist kein Beamter.");
    format(string, sizeof(string), "** %s %s: %s, over **", GetRankName(Spieler[playerid][pFraktion], Spieler[playerid][pRank]), GetName(playerid), text);
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i))
    {
    if(Spieler[i][pFraktion] == 1 || Spieler[i][pFraktion] == 3)
    {
    SendClientMessage(i, COLOR_DEPARTMENT, string);
    return 1;
    }
    }
    }
    return 1;
    }

  • Nein, dann funktioniert es nicht.
    Schreibt dann z.B jemand aus Fraktion 0 sieht der aus Fraktion 3 nicht mal mehr die Eingabe.


    Hier die Funktion
    stock GetRankName(frakID, rank)
    {
    new string[32];
    switch(rank)
    {
    case 0: format(string, sizeof(string), fRang[frakID][fRangName0]);
    case 1: format(string, sizeof(string), fRang[frakID][fRangName1]);
    case 2: format(string, sizeof(string), fRang[frakID][fRangName2]);
    case 3: format(string, sizeof(string), fRang[frakID][fRangName3]);
    case 4: format(string, sizeof(string), fRang[frakID][fRangName4]);
    case 5: format(string, sizeof(string), fRang[frakID][fRangName5]);
    case 6: format(string, sizeof(string), fRang[frakID][fRangName6]);
    case 7: format(string, sizeof(string), fRang[frakID][fRangName7]);
    case 8: format(string, sizeof(string), fRang[frakID][fRangName8]);
    }
    return string;
    }


    Mit der lese ich lediglich die Rang Namen aus

  • Ok, entferne auf jeden Fall mal das "return 1" nach SendClientMessage, das gehört da nicht hin. Wobei das nicht der Grund für die Fehlermeldung sein sollte, dass der Befehl nicht existiert, aber dann bekommt jeder die Nachricht.


    Wenn das Problem mit der "Befehl existiert nicht" Meldung noch besteht, debugge den Code so:
    CMD:department(playerid, params[])
    {
    printf("playerid: %d, logged: %d", playerid, IsLoggedIn(playerid));
    if(!IsLoggedIn(playerid))return 1;
    new text[96], string[128];
    if(sscanf(params, "s[96]", text))return SendClientMessage(playerid, COLOR_GREY, "** Benutze (/d)epartment [Nachricht]");
    printf("Spieler: %d", sizeof(Spieler));
    printf("Fraktion: %d", Spieler[playerid][pFraktion]);
    if(!(Spieler[playerid][pFraktion] == 1 || Spieler[playerid][pFraktion] == 3))return SendClientMessage(playerid, COLOR_GREY, "** Du bist kein Beamter.");
    printf("vor string");
    format(string, sizeof(string), "** %s %s: %s, over **", GetRankName(Spieler[playerid][pFraktion], Spieler[playerid][pRank]), GetName(playerid), text);
    printf("string: %s", string);
    for(new i=0;i<GetMaxPlayers();i++)
    {
    printf("Schleife: %d", i);
    if(IsPlayerConnected(i))
    {
    if(Spieler[i][pFraktion] == 1 || Spieler[i][pFraktion] == 3)
    {
    printf("Sende Nachricht");
    SendClientMessage(i, COLOR_DEPARTMENT, string);
    }
    }
    }
    return 1;
    }


    Dann poste was im Log steht.

  • Hier der Ausschnitt der Server Log.
    Wie man sieht wird die Nachricht von Herzog abgesendet, meine wiederum geht nicht bis zum absenden der Nachricht.

  • Ok, dann hätten wir schonmal eine Nähe. Ändere
    printf("vor string");
    Zu
    printf("vor string: Frak %d / Rang %d", Spieler[playerid][pFraktion], Spieler[playerid][pRank]);


    Wie sieht der Print dann aus?
    Falls Frak negativ ist, solltest du das in dem stock abfangen. Falls nicht, wie hast du fRang deklariert?

  • Hier mal die aktuelle Server Log mit den Änderungen.

  • Hast du mal so probiert?


    1
    2
    3
    4
    public OnPlayerCommandPerformed(playerid, cmdtext[], success)
    {
    if(!success)
    {
    return SendClientMessage(playerid, COLOR_WHITE, "Der eingegebene Befehl wurde nicht gefunden. Bitte verwende {33AA33}/help");
    }
    return 1;
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Vermutlich kann er den String nicht auslesen.
    Eventuell:
    printf("vor string: Frak %d / Rang %d", Spieler[playerid][pFraktion], Spieler[playerid][pRank]);


    Ändern zu:


    printf("string: %s", string);


    Bin mir allerdings nicht sicher. Probieren hilft immer. ^^

  • Im Enum, ist genauer gesagt ein dynamisches Rang System.
    enum e_RangData
    {
    fID,
    fRangName0[32],
    fRangName1[32],
    fRangName2[32],
    fRangName3[32],
    fRangName4[32],
    fRangName5[32],
    fRangName6[32],
    fRangName7[32],
    fRangName8[32],
    };
    new fRang[MAX_FRACS][e_RangData];

  • Funktioniert nun, leider habe ich noch zwei weitere Fragen, bevor ich dieses Thema erledigen möchte. Jeffry:


    Ich möchte bei meinen /motor Befehl einbauen, dass nur der Besitzer o. der Spieler der sich in der Fraktion befindet, den Motor starten kann.
    Mit der Fraktion habe ich es schon hinbekommen, nur mit dem privaten Fahrzeugen hapert das ganze noch.
    Das System startet eine Schleife durch alle Spieler, prüft ob die vehicleid in der der Spieler sitzt, mit der Datenbank ID übereinstimmt.
    Bekomme es aber nicht hin, dass nur der Besitzer das private Fahrzeug starten kann.
    for(new i=0;i<GetMaxPlayers();i++)
    {
    for(new slot = 0;slot<MAX_PLAYER_VEHICLES;slot++)
    {
    if(vehicleid == PrivateVehicle[i][slot][vehID])
    {
    if(Vehicle[PrivateVehicle[i][slot][vehID]][vehMotor] == false)
    {
    Vehicle[PrivateVehicle[i][slot][vehID]][vehMotor] = true;
    GetVehicleParamsEx(PrivateVehicle[i][slot][vehID], engine, lights, alarm, doors, bonnet, boot, objective);
    SetVehicleParamsEx(PrivateVehicle[i][slot][vehID], VEHICLE_PARAMS_ON, lights, alarm, doors, bonnet, boot, objective);
    GameTextForPlayer(playerid, "~w~Motor ~g~gestartet", 1000, 6);
    Vehicle[PrivateVehicle[i][slot][vehID]][VehicleTimer] = SetTimerEx("OnVehicleTimer", 1136, 1, "i", PrivateVehicle[i][slot][vehID]);
    return 1;
    }
    else if(Vehicle[PrivateVehicle[i][slot][vehID]][vehMotor] == true)
    {
    Vehicle[PrivateVehicle[i][slot][vehID]][vehMotor] = false;
    GetVehicleParamsEx(PrivateVehicle[i][slot][vehID], engine, lights, alarm, doors, bonnet, boot, objective);
    SetVehicleParamsEx(PrivateVehicle[i][slot][vehID], VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    GameTextForPlayer(playerid, "~w~Motor ~r~ausgeschaltet", 1000, 6);
    KillTimer(Vehicle[PrivateVehicle[i][slot][vehID]][VehicleTimer]);
    return 1;
    }
    }
    }
    }
    _
    Zu meinen zweiten Problem, es hapert was am dynamischen Rang System.
    Alle Fraktionen 0-3 funktionieren, bis auf Fraktion 4. Das wundert mich, kann vielleicht jemand den Fehler erkennen?
    CMD:configrank(playerid)
    {
    if(!IsLoggedIn(playerid))return 1;
    if(Spieler[playerid][pFraktion] < 1)return SendClientMessage(playerid, COLOR_GREY, "** Du gehörst keiner Fraktion an!");
    if(Spieler[playerid][pRank] < 8)return SendClientMessage(playerid, COLOR_GREY, "** Du bist kein Leader.");
    new frakID = Spieler[playerid][pFraktion];
    strdel(DialogString, 0, sizeof(DialogString));
    format(DialogString, sizeof(DialogString), COLOR_HEX_WHITE"Rang 0: %s\nRang 1: %s\nRang 2: %s\nRang 3: %s\nRang 4: %s\nRang 5: %s\nRang 6: %s\nRang 7: %s\nRang 8: %s",
    fRang[frakID][fRangName0], fRang[frakID][fRangName1], fRang[frakID][fRangName2], fRang[frakID][fRangName3], fRang[frakID][fRangName4],
    fRang[frakID][fRangName5], fRang[frakID][fRangName6], fRang[frakID][fRangName7], fRang[frakID][fRangName8]);
    ShowPlayerDialog(playerid, DIALOG_CONFIGRANK, DIALOG_STYLE_LIST, "Fraktions-Menü: Ränge konfigurieren", DialogString, "Ändern", "Abbrechen");
    return 1;
    }


    //edit:Jeffy angesprochen

    Einmal editiert, zuletzt von Jean_Pacino () aus folgendem Grund: //edit:Jeffy angesprochen

  • Problem 1:
    Wo speicherst du den Wert der Fraktion, der das Fahrzeug angehört?
    Hast du da sowas wie:
    PrivateVehicle[i][slot][FrakID]
    das Selbe für den Beseitzer. Poste am besten mal das enum welches zu "PrivateVehicle" gehört.


    Problem 2:
    Wenn du Fraktion 0 - 4 hast, musst du MAX_FRAKS auf 5 setzen.

  • Hier mal das Enum zu den privaten Fahrzeugen. Zu Problem 2, logischer Denkfehler meinerseits, danke!
    enum e_VehicleData
    {
    vehID,
    vehBesitzer[MAX_PLAYER_NAME+1],
    modelid,
    Float:vehPosX,
    Float:vehPosY,
    Float:vehPosZ,
    Float:vehPosA,
    Float:vehPosX2,
    Float:vehPosY2,
    Float:vehPosZ2,
    Float:vehHealth,
    vehColor1,
    vehColor2,
    vehPaintjob,
    vehSpoiler,
    vehHood,
    vehRoof,
    vehSideskirt,
    vehLamps,
    vehNitro,
    vehExhaust,
    vehWheels,
    vehStereo,
    vehHydraulics,
    vehFrontBumper,
    vehRearBumper,
    vehVentRight,
    vehVentLeft,
    vehPreis,
    vehNeon1,
    vehNeon2,
    vehNeonID,
    vehNumberPlate[32],
    Float:vehFuel,
    Float:vehKMStand,
    vehInterior,
    vehWorld,
    vehTankKM,
    vehKMStandCount,
    bool:vehMotor,
    bool:vehLicht,
    bool:vehHaube,
    bool:vehKRaum,
    VehicleTimer,
    Text3D:vehText,
    vehFraktion,
    dbID,
    };

  • Dann sollte es so aussehen müssen, wenn ich dein enum richtig interpretiere:
    for(new i=0;i<GetMaxPlayers();i++)
    {
    for(new slot = 0;slot<MAX_PLAYER_VEHICLES;slot++)
    {
    if(vehicleid == PrivateVehicle[i][slot][vehID])
    {
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(i, pname, MAX_PLAYER_NAME);
    if(strcmp(pname, PrivateVehicle[i][slot][vehBesitzer]) != 0 && PrivateVehicle[i][slot][vehFraktion] != SpielerInfo[i][Fraktion])
    {
    SendClientMessage(i, 0xFF0000FF, "Fahrzeug gehört nicht dir, oder deiner Fraktion.");
    return 1;
    }
    if(Vehicle[PrivateVehicle[i][slot][vehID]][vehMotor] == false)
    {
    Vehicle[PrivateVehicle[i][slot][vehID]][vehMotor] = true;
    GetVehicleParamsEx(PrivateVehicle[i][slot][vehID], engine, lights, alarm, doors, bonnet, boot, objective);
    SetVehicleParamsEx(PrivateVehicle[i][slot][vehID], VEHICLE_PARAMS_ON, lights, alarm, doors, bonnet, boot, objective);
    GameTextForPlayer(playerid, "~w~Motor ~g~gestartet", 1000, 6);
    Vehicle[PrivateVehicle[i][slot][vehID]][VehicleTimer] = SetTimerEx("OnVehicleTimer", 1136, 1, "i", PrivateVehicle[i][slot][vehID]);
    return 1;
    }
    else if(Vehicle[PrivateVehicle[i][slot][vehID]][vehMotor] == true)
    {
    Vehicle[PrivateVehicle[i][slot][vehID]][vehMotor] = false;
    GetVehicleParamsEx(PrivateVehicle[i][slot][vehID], engine, lights, alarm, doors, bonnet, boot, objective);
    SetVehicleParamsEx(PrivateVehicle[i][slot][vehID], VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
    GameTextForPlayer(playerid, "~w~Motor ~r~ausgeschaltet", 1000, 6);
    KillTimer(Vehicle[PrivateVehicle[i][slot][vehID]][VehicleTimer]);
    return 1;
    }
    }
    }
    }