Beiträge von DasNeo

    Versuchs bei der Ausgabe einfach mal mit einem %i anstatt einem %d.
    Ein Fehler ist da aber sonst nicht drin.


    Oder noch besser:


    switch(gangID)
    {
    case 0: { gangName = "Gang 1" }
    case 1: { gangName = "Gang 2" }
    }


    format(nstring,sizeof nstring,"Du wurdest von %s zum Leader der Fraktion %s ernannt!",DerAdmin,gangName);

    Global:


    PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME+1]; // Hier speicherst du die Namen, die du änderst.


    OnPlayerEnterVehicle(...)
    {
    if(vehicleid == ....) {
    new nName[MAX_PLAYER_NAME+1];
    GetPlayerName(playerid, PlayerName[playerid], sizeof(PlayerName[playerid]));
    format(nName, sizeof(nName), "[TEST]%s", PlayerName[playerid]);
    SetPlayerName(playerid, nName);
    }
    return 1;
    }


    OnPlayerExitVehicle(....)
    {
    SetPlayerName(playerid, PlayerName[playerid]);
    return 1;
    }


    Zwar ungetestet, sollte aber so funken.


    Gruß,
    Neo. :)

    Du benutzt die switch-case-Funktion auch ganz falsch. :O


    Man benutzt sie eigentlich so:


    switch(irgendwas)
    {
    case 0:
    {
    // Code
    }
    // Keinen Code hier rein!
    case 1:
    {
    // Code
    }
    // Keinen Code hier rein!
    case 2:
    {
    // Code
    }
    }


    Zwischen den einzelnen cases darfst du keinen Code schreiben.


    case 0, 1, 2:
    {
    gTeam[playerid] = TEAM_BALLAS;
    GivePlayerWeapon(playerid,16,10);
    GameTextForPlayer(playerid, "~p~Ballas", 3000, 3);
    SetPlayerColor(playerid,LILA);
    }
    So wäre es richtig.


    Gruß,
    Neo. :)

    Nein, so nicht.
    Habe mich mal kurz ran gesetzt, und das hier für dich gebastelt. Ist zwar ungetestet und aus dem Kopf geschrieben, sollte allerdings laufen.


    Spoiler anzeigen

    Global, also oben im Script.
    new fText[200], playerName[MAX_PLAYER_NAME+1]; // Globale definierung, um Resourcen zu sparen, da wir das in mehreren Funktionen brauchen.
    new PlayerTicket[MAX_PLAYERS];
    /*
    PlayerTicket[playerid] = 501; bedeutet, dass er ein Ticket erstellt hat. (Setz das am besten auf deine Slots +1, damit die Playerid keiner haben kann.)
    PlayerTicket[playerid] = -1; bedeutet, dass er kein Ticket offen hat.
    */

    Spoiler anzeigen

    ocmd:report(playerid, params[])
    {
    new sText[128];
    if(PlayerTicket[playerid] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Du hast bereits ein Ticket geöffnet. Wartes bis es angenommen wird, oder lösche es mir /reportloeschen.");
    if(sscanf(params, "s", sText)) return SendClientMessage(playerid, 0xFF0000FF, "Benutzung: /report [Text]");
    GetPlayerName(playerid, playerName, sizeof(playerName));
    format(fText, sizeof(fText), "[Report] %s: %s", playerName, sText);
    for(new i; i < MAX_PLAYERS; i++)
    {
    if(GetPVarInt(i, "admin") >= 1)
    {
    SendClientMessage(i, 0x000FFBFF, fText);
    SendClientMessage(i, 0x000FFBFF, "Du kannst das Ticket mit '/reportoeffnen' öffnen.");
    }
    }
    SendClientMessage(playerid, 0x000FFBFF, fText);
    PlayerTicket[playerid] = 501; // Einfach nur, damit das nicht mehr -1 ist, und diese ID auch keiner haben kann.
    return 1;
    }

    Spoiler anzeigen
    ocmd:reportloeschen(playerid, params)
    {
    if(PlayerTicket[playerid] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Du hast kein Ticket eröffnet, also kannst du es auch nicht löschen.");
    PlayerTicket[playerid] = -1;
    SendClientMessage(playerid, 0x000FFBFF, "Du hast dein Ticket erfolgreich gelöscht!");
    return 1;
    }

    Spoiler anzeigen
    ocmd:reportoeffnen(playerid, params[])
    {
    new playerName1[MAX_PLAYER_NAME+1];
    if(GetPVarInt(playerid, "admin") < 1) return SendClientMessage(playerid, 0xFF0000FF, "Du bist kein Admin, und hast nicht die Rechte diesen Befehl zu nutzen!");
    if(sscanf(params, "u", pID)) return SendClientMessage(playerid, 0xFF0000FF, "Benutzung: /reportoeffnen [Playerid/TeilDesNamens]");
    if(PlayerTicket[pID] != 501 || PlayerTicket[pID] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Diesem Spieler wird bereits geholfen, oder er hat sein Ticket gelöscht!");
    PlayerTicket[playerid] = pID;
    PlayerTicket[pID] = playerid;
    SendClientMessage(playerid,0x000FFBFF ,"Du kannst nun mit dem Spieler reden!");
    GetPlayerName(playerid, playerName, sizeof(playerName));
    GetPlayerName(pID, playerName1, sizeof(playerName1));
    SendClientMessage(pID, 0x000FFBFF, "____________SUPPORT____________");
    format(fText,sizeof(fText), "Guten Tag, %s. Mein Name ist %s. Wie kann ich Ihnen helfen?", playerName1, playerName);
    SendClientMessage(pID, 0x000FFBFF, fText);
    return 1;
    }

    Spoiler anzeigen
    ocmd:reportschliessen(playerid, params[])
    {
    if(GetPVarInt(playerid, "admin") < 1) return SendClientMessage(playerid, 0xFF0000FF, "Du bist kein Admin, und hast nicht die Rechte diesen Befehl zu nutzen!");
    if(PlayerTicket[playerid] != -1) return SendClientMessage(playerid, 0xFF0000FF, "Du bist in keinem Supportgespräch, welches du beenden könntest.");
    new pID = Ticket[playerid];
    SendClientMessage(pID, 0xFF0000FF, "Dein Supporter hat den Chat geschlossen! Schönen Tag noch auf dem Server! =)");
    Ticket[pID] = -1;
    Ticket[playerid] = -1;
    return 1;
    }

    Spoiler anzeigen
    public OnPlayerText(playerid, text[])
    {
    if(PlayerTicket[playerid] == 501 || PlayerTicket[playerid] == -1) return 1;
    GetPlayerName(playerid, playerName, sizeof(playerName));
    format(fText, sizeof(fText) ,"[Support] %s: %s", playerName, text);
    SendClientMessage(PlayerTicket[playerid], 0x000FFBFF, text);
    return 1;
    }


    Du musst das ganze noch auf dein Adminsystem anpassen. (GetPVarInt(playerid, "admin") habe ich hier verwendet.)


    Gruß,
    Neo. :)

    Zitat

    Ich hatte vor, erst alles mit dini zu machen und am Ende alles umzuschreiben auf eine andere Speicherungsart.

    Das wäre doch doppelte Arbeit. - Versuchs direkt mit MySQL. Habe mich dort am Anfang auch schwer mit getan, aber dafür ist das Forum ja da. :b

    Na du machst einfach einen Timer, der jede X Minuten deine Daten aktualisiert.


    (SetPlayerScore(playerid, dini_Int...))


    Anders ist es nicht möglich.


    Gruß,
    Neo. :)

    Jaein.



    Du müsstest halt einen Timer rein machen, der dir alle 5 Minuten (oder so) das Zeug aktualisiert. Ansonsten ist das nicht möglich, auch nicht mit MySQL.
    Es aktualisiert sich immer nur dann, wenn vom Script vorgesehen.


    Gruß,
    Neo. :)

    Problem an der Sache ist, dass dann nicht mehrere Tickets auf einmal beantwortet werden können. - Und das ist auch dein Fehler.


    Wenn der Supporter das Ticket annimmt, dann setz eine Variable des Supporters auf die ID des Hilfesuchenden und umgekehrt.
    (Sprich:
    Supporter Peter mit ID 20 bekommt die Variable auf 3 gesetzt
    Hilfesuchender Hannes mit ID 3 bekommt die Variable auf 20 gesetzt.
    Die Variable sollte Standartmäßig auf -1 gesetzt werden. (Global))


    Dann kannst du bei OnPlayerText abfragen, ob seine Variable != -1 ist.
    Falls sie das nicht ist, dann schickst du dem Player mit der ID in der Variable eine Nachricht.
    (Wenn deine Variable PlayerTicket heißt so:
    format(message, sizeof(message), "[Ticket]%s : %s"pName, text);
    SendClientMessage(PlayerTicket[playerid], 0xFF0000FF, message))


    Gruß,
    Neo. :)

    Hey,


    das liegt daran, dass du das sscanf vor die anderen Abfragen machen musst, da er erst dann eine wirkliche ID hat.


    Sprich:


    if(sscanf(params, "u", PlayerWhoGetsSlapped)) return SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Gebrauch: /slap [ID]!");
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist kein Admin!");
    if(!IsPlayerConnected(PlayerWhoGetsSlapped)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Dieser Spieler ist nicht online!");




    Anstatt



    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist kein Admin!");
    if(!IsPlayerConnected(PlayerWhoGetsSlapped)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Dieser Spieler ist nicht online!");
    if(sscanf(params, "u", PlayerWhoGetsSlapped)) return SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Gebrauch: /slap [ID]!");

    Das mit der eigene Funktion ist so ne Sache haus mal unter OnPlayerSpawn rein


    Huh. Das funktioniert :O. Jedenfalls teilweise.
    #define zivispawn 1642.1669,-2332.9575,13.5469


    SetPlayerPos(playerid,zivispawn);


    Spawnt mich auf die Position 0.0,0.0,0.0 'ne Idee warum?


    Thank you so far.


    Hast du denn auch eine AddPlayerClass unter OnGameModeInit? :)


    Würdest du lesen, wüsstest du, dass ich das habe. :{


    SetSpawnInfo <- such das im Script.
    Sollte es nicht vorhanden sein setzt dies beim Einloggen rein genauso beim Registrieren 8)


    Ist SetSpawnInfo denn wirklich so wichtig? Habe es, ehrlich gesagt, noch nie benutzt, und hatte bisher damit auch keine Probleme.

    mach mal Crashdetect raus und compile das Script nochmal


    Script[gamemodes/drl.amx]: Run time error 19: "File or function is not found", war doch irgendwie klar, oder? :P



    Plugins alle drinne ?


    Zeig mal die Serverlog.


    Hallöchen,


    habe das Problem, dass ich bei einem meiner Scripts einen Run time error 19 "File or funktion not found" habe.


    Crashdetect gibt mir nur aus:


    Code
    [22:33:55] [crashdetect]: Cannot identify file name
    [22:33:55] Script[gamemodes/drl.amx]: Run time error 19: "File or function is not found"


    Ich habe gelesen, dass ich mir eine andere "Version" dafür runterladen solle. Habe ich gemacht, und diese gibt mir nun:


    Code
    [22:34:47] crashdetect: Found file: gamemodes\drl.amx
    [22:34:47] crashdetect: gamemodes\drl.amx does not contain debug information
    [22:34:47] Script[gamemodes/drl.amx]: Run time error 19: "File or function is not found"


    Naja, nun weiß ich leider auch nicht weiter.