Beiträge von linux_

    Hallo,


    bei OnPlayerDisconnect sollte beachtet werden, dass überprüft werden soll, ob der Spieler eingeloggt war (mit seinem Account), oder ob er connectet ist und einfach wieder disconnectet ist. Wenn er eingeloggt war erstellst du einfach ein Pickup:

    for (new i = 0; i < sizeof(LogoutPickups); i++)
    {
    if (LogoutPickups[i][PickupID] == 0)
    {
    find = 1;
    slotid = i;
    break;
    }
    }


    if (find == 1)
    {
    LogoutPickups[slotid][PickupID] = CreatePickup(...);
    LogoutPickups[slotid][PickupPlayername] = playername;
    LogoutPickups[slotid][PickupSeconds] = 0;
    }


    Achja und es heißt nicht new Pickups sondern new LogoutPickups. Ist mir ein Fehler unterlaufen.

    Hallo,


    ich habe als allererstes einmal ein ENUM erstellt.

    enum MeinTotalesEnum
    {
    PickupID,
    PickupPlayername[MAX_PLAYER_NAME]
    PickupSeconds,
    };


    new Pickups[200][MeinTotalesEnum];


    Wenn der Spieler offline geht, wird ein Pickup erstellt und im Enum alle Daten festgehalten (aber nur wenn der Spieler eingeloggt ist). Danach mit einem Timer der einen Intervall von 1000 Millisekunden hat, das ganze Array durchgehen und PickupSeconds (sofern PickupID != 0 ist) um 1 erhöhen. Bei 60 angekommen, wird das Pickup im Timer gelöscht. PickupID enthält logischerweise die ID des Pickups.


    Danach bei OnDialogResponse (bei dem Login Dialog) kommt dann folgendes rein:

    new playername[MAX_PLAYER_NAME], find;


    GetPlayerName(playerid, playername, sizeof(playername));


    for (new i = 0; i < sizeof(LogoutPickups); i++)
    {
    if (LogoutPickups[i][PickupID] != 0)
    {
    if (!strcmp(playername, LogoutPickups[i][PickupPlayername], true))
    {
    // pickup wurde noch gefunden
    find = 1;
    break;
    }
    }
    }


    if (find == 1)
    {
    // pickup gefunden meldung
    }
    else
    {
    // spieler halt spawnen und spielerinfos laden
    }

    Hallo,


    ich habe mal eine Lösung für dich erstellt.



    new query[700], string[256];


    format(string, sizeof(string), "UPDATE "Tabelle_Fraktionen" SET frakname='%s', fraktionskasse='%d', rangname1='%s', rangname2='%s', ", FraktionInfo[1][pFraktionsname],FraktionInfo[1][pFraktionskasse],FraktionInfo[1][pRangname1],FraktionInfo[1][pRangname2]);
    strcat(query, string);


    format(string, sizeof(string), "rangname3='%s', rangname4='%s', rangname5='%s', rangnameleader='%s',rang1_gehalt='%d', ", FraktionInfo[1][pRangname3],FraktionInfo[1][pRangname4],FraktionInfo[1][pRangname5],FraktionInfo[1][pRangnameLeader],FraktionInfo[1][pRang1_Gehalt]);
    strcat(query, string);


    format(string, sizeof(string), "rang2_gehalt='%d', rang3_gehalt='%d', rang4_gehalt='%d', rang5_gehalt='%d', rangleader_gehalt='%d', ", FraktionInfo[1][pRang2_Gehalt],FraktionInfo[1][pRang3_Gehalt],FraktionInfo[1][pRang4_Gehalt],FraktionInfo[1][pRang5_Gehalt],FraktionInfo[1][pRangLeader_Gehalt]);
    strcat(query, string);


    format(string, sizeof(string), "spawninterior='%d', spawnpos_x='%f', spawnpos_y='%f', spawnpos_z='%f', fraktionsfarbe='%s' WHERE id='%d'", FraktionInfo[1][pSpawnInterior],FraktionInfo[1][pSpawnPosX],FraktionInfo[1][pSpawnPosY],FraktionInfo[1][pSpawnPosZ],FraktionInfo[1][pFraktionsFarbe],1);
    strcat(query, string);


    mysql_query(query);


    Sollte das nicht gehen, möchte ich wissen, warum du "Tabelle_Funktionen" nicht via. %s einbindest ? Du formatierst ja sowieso den String.


    Desweiteren habe ich entdeckt, dass du
    FraktionInfo[1][pRang1_Skin],FraktionInfo[1][pRang2_Skin],FraktionInfo[1][pRang3_Skin],FraktionInfo[1][pRang4_Skin],FraktionInfo[1][pRang5_Skin],FraktionInfo[1][pRangLeader_Skin],1);
    das am letzten Teil stehen hast. Jedoch ist das sinnlos, da du in dem SQL diese Infos nicht brauchst bzw. in deinem format.

    Hallo,


    MySQL entlastet nicht den Server. Um Ressourcenschonend zu scripten, solltest du schauen, dass du Spielerdaten die im Spiel geupdatet werden nicht direkt via. MySQL aktuallisierst, sondern erst wenn der Spieler sich ausloggt oder alle 15 Minuten über einen Timer aktuallisiert werden.


    Solltest du genau das Gegenteil machen, was ich oben erklärt habe, kann es sein, dass der Server oft mal abstürzt.

    Hallo,


    mit einem Timer kannst du dann hoch zählen lassen, wie lange das Pickup schon da steht und ggf. ab 60 Sekunden das Pickup löschen lassen. Bei meinem GameMode habe ich das so gelöst, dass der Spieler sich solange nicht mehr einloggen kann, bis sein Logout- Pickup nach 60 Sekunden gelöscht wurde.


    Sollte der Spieler sich einloggen während das andere Pickup noch da ist und sich noch gleich ausloggen, kann es sein, dass 2 Pickups vorhanden sind während eines dann immer bestehen bleiben würde. Wie gesagt, versuch das mit dem Timer und der Login "Verweigerungs"- Methode.

    Hallo,


    ich möchte dich darauf aufmerksam machen, dass das Hackprogramm S0beit keine Clientdaten mehr an den Server sendet. Das heißt also, du kannst nicht ermitteln ob der Spieler eine Waffe in der Hand hat bzw. wie viel Munition seine aktuelle Waffe hat. Es gibt aber allerdings noch andere Hackprogramme, die weiterhin Clientdaten senden. Gegen diese kannst du wie folgt vorgehen:

    • Du speicherst in einem Array ab, welche WaffenID (von dem Spieler) wie viel Munition hat.
    • Ein Timer der ca. alle 100 Millisekunden aufgerufen wird, speichert die Munition ab.
    • Wenn die Munition mehr geworden ist, obwohl der Spieler keine Munition gekauft hat -> Bann


    So in etwa liese sich das realisieren. Du kannst allerdings auch "JunkBuster" verwenden. Ich höre nur gutes über dieses Anti-Cheat Tool. => Klick


    Ich habe mal eine Lösung gegen S0beit gehabt, die das "Ich sende keine Clientdaten"- System umgeht und trotzdem S0beit ausfindig macht. Sobald mir das wieder einfällt, werde ich mich diesbezüglich bei dir melden.

    Hallo,


    bei manchen Objekten in GTA: San Andreas ist das so. Ich wollte selber mal auf einem Selfmade Reallife Script von mir die Ordnungsamt- Base in San Fierro machen wo auf manchen Servern die Fahrschule ist. Als ich die Tore entfernt habe, waren noch so graue (manchmal durchsichtige) Objekte vorhanden, die früher einmal das Tor repräsentiert hatten.


    Anders kannst du diese Dreckhaufen meines Wissens nicht entfernen.