Beiträge von Kasakow

    Ich habe gerade gemerkt, dass GetPlayerCameraTargetObject existiert, sehr sehr geil!
    Es ist ein Hinweis beigelegt, dieser weißt darauf hin dass die Funktion standardmäßig deaktiviert ist.
    Sie sei deaktiviert um Bandbreite zu sparen, wie sehr macht es sich denn bemerkbar, wenn ich sie benötige für eine Funktion und sie auch dauerhaft anlasse? Hat jemand damit Erfahrung gemacht?

    Moin.
    Ich experimentiere sehr viel rum und mir ist etwas aufgefallen. Ich teste meinen Code auf einem Linux System und wenn ich den Prozess beende, dann reagiert der Server nicht schnell genug um OnPlayerDisconnect aufzurufen. Ich habe in der Wiki gelesen das es mit Ongamemodeexit nicht funktionieren wird beim Prozessende und/-oder Server Crash nicht aufgerufen. Merkt man eine 5-10 Minütige gesamt Speicherung in der Performance? Oder gibt es da eine andere Methode?

    @LordDemacia
    Auch wenn mein Code selber manchmal unordentlich ist, möchte dir diesbezüglich, mal ein paar Tipps geben.


    Verwende wie ich bereits gestern erwähnte Makros, es ist nicht sehr "gut", überall im Skript, jederzeit, den Spieler Namen erneut auszulesen, wenn es einmal auch reicht.
    Wenn du eine Variable erstellst, erstelle sie alle auf einmal, und nicht einzeln.
    Verwende doch Tab anstatt Leerzeichen um deine Zeilen einzurücken, das ist schrecklich, aber genau so, habe ich es in meiner Anfangszeit auch gemacht, ist aber so ziemlich hässlich, benutze Tab.
    Ich weiß dass es bei einer bestimmten sscanf Version der Fall war, dass man die String Länge auch bei der Nutzung angeben musst, probiere es mal ohne, ich kann es auch problemlos ohne Angabe nutzen.
    Frage am Besten gleich ab ob er Eingeloggt ist & nicht ob er nur Online ist.
    Ban & Kick hintereinander? Das macht kein Skin, bei der Ban Funktion wird man ebenfalls gekickt.
    Nutze Banfix oder einen eigenen Timer der die das mit dem Kickfix übernimmt, sprich, wenn du es so machst, wird dem Spieler selbst, die Nachricht nicht angezeigt, warum er gebannt/gekickt wurde.


    Soo
    Wie gesagt, erstell dir mal in deiner Datenbank Struktur ein Feld was sich 'ban' nennt & richte es beim Speichern & Laden ein.
    Habe dir mal den Code umgeschrieben & kleine Erklärungen unterkommentiert, hoffentlich kannst du was mit anfangen.



    //Makro für das Spielernamen ausgeben, kann für jeden Spieler der Online ist, genutzt werden.
    #define getName(%0) PlayerInfo[%0][pName]


    //Bei deinem Player Enum fügst du hinzu & pBan
    pName[MAX_PLAYER_NAME+1],
    pBan,


    //Einmalig bei OnPlayerConnect
    GetPlayerName(playerid, getName(playerid), MAX_PLAYER_NAME+1);


    CMD:ban(playerid, params[])
    {
    if(PlayerInfo[playerid][pAdmin] < 1)return SendClientMessage(playerid, -1,"Du bist kein Admin. Du kannst den Befehl nicht nutzen!");
    new PID, str[128];
    if(sscanf(params, "us", PID, str)) return SendClientMessage(playerid, -1, "[Benutze] /ban [playerid] [Grund]");
    if(!PlayerInfo[PID][pLoggedIn])return SendClientMessage(playerid, -1, "Spieler ist nicht eingeloggt!");
    format(str, sizeof str, "'%s' wurde gebannt von [Admin] '%s'. [Grund:] %s", getName(PID), getName(playerid), str),
    SendClientMessageToAll(-1, str),
    pInfo[PID][pBan] = 1,
    Kick(PID);
    return 1;
    }


    //EDIT Admin Abfrage abgeändert. || Banfix ist ein Include, lad es dir mal runter.


    Meine SSCANF Version, die ich nutze. <- Download
    BanFix - Include | Download

    Ah ne, Whice hat Recht.
    Wenn du willst, dass dir der Skin angezeigt wird, setze ihn auch.


    Schreib es mal so:



    //z.B unter die Includes
    //Makros
    #define getSkin(%0) pInfo[%0][pSkin] //%0 ist der erste Platzhalter
    #define setSkin(%0,%1) pInfo[%0][pSkin]=%1,SetPlayerSkin(%0,%1) //%0 = playerid, %1 = integerwert z.B für den Skin


    public OnUserLogin(playerid)
    {
    new rows;
    cache_get_row_count(rows);
    if(rows == 0)
    {
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
    }
    else
    {
    cache_get_value_name_int(0, "id", PlayerInfo[playerid][p_id]);
    cache_get_value_name_int(0, "level", PlayerInfo[playerid][pLevel]);
    cache_get_value_name_int(0, "money", PlayerInfo[playerid][pMoney]);
    cache_get_value_name_int(0, "kills", PlayerInfo[playerid][pKills]);
    cache_get_value_name_int(0, "skin", PlayerInfo[playerid][pskin]);
    PlayerInfo[playerid][pLoggedIn] = true;
    SendClientMessage(playerid, 0x00FF00FF, "[Konto] Eingeloggt");
    GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]),
    setSkin(playerid, PlayerInfo[playerid][pSkin]);
    }
    return 1;
    }


    Und speichern kannst es so lassen oder du nutzt, getSkin(playerid); .. Kommt auf das gleiche hinaus