Beiträge von Jeffry

    Dann versuche es so:
    //Dialog_register Wenn er sich registiert
    dini_IntSet(path, "BarGeld",5000);
    ResetPlayerMoney(playerid);
    ConsumingMoney[playerid] = 1;
    PlayerMoney[playerid] = 5000;

    [21:28:43] Loading plugin: crashdetect.so
    [21:28:43] Failed (plugins/crashdetect.so: invalid ELF header)

    Der Fehler ist mir so noch nie unter gekommen, auch im englischen Forum kann ich dazu nichts finden.
    Nutzt du das crashdetect Plugin von dem Link, den ich dir gegeben habe?

    Lege dir ein zweites Windows Benutzerkonto auf dem Rechner an und verbinde dich damit zum Server. Dann gehe auf Benutzer wechseln (nicht abmelden!) und melde dich mit dem anderen Konto an.
    Dann kannst du so hin und her wechseln.

    Lade dir das Crashdetect Plugin herunter und füge es in deinen Server ein:
    http://forum.sa-mp.com/showthread.php?t=262796


    Dann poste was im Server Log steht, wenn der Server abstürzt.



    Schritte:
    1) crashdetect (so/dll je nach dem ob Linux/Windows) in den Plugins Ordner einfügen
    2) "crashdetect" (Windows) oder "crashdetect.so" (Linux) in der server.cfg bei "plugins" eintragen
    3) Server Log löschen
    4) Server neu starten und abstürzen lassen
    5) Vollständigen Server Log posten

    Die etwas neueren Versionen von Notepad++ rücken auch automatisch schon ein, wenn man eine Klammer öffnet und schließt, sprich setzen den Cursor direkt an die richtige Stelle. Zum Teil werden auch die Klammern an die richtige Stelle verschoben, wenn man sie falsch setzt.

    Wenn es nur verschoben ist, und nicht Zeilenübergreifend mehrere Klammern stehen, dann kannst du es mit Notepad++ machen.
    Plugin Manager -> TextFX Characters -> Installieren
    TextFX -> TextFX Edit -> Reindent C++ code

    //Dialog_register Wenn er sich registiert
    dini_IntSet(path, "BarGeld",Spieler[playerid][Gestorben] = 5000);
    Spieler[playerid][BarGeld] = GetPlayerMoney(playerid);


    zu:
    //Dialog_register Wenn er sich registiert
    dini_IntSet(path, "BarGeld",5000);
    GivePlayerMoney(playerid, 5000);
    Spieler[playerid][BarGeld] = 5000;

    Ich nehme an, dass das Textlabel des Fahrrad-Verleihs die ID 0 hat.
    Da du in deinem Timer das Textlabel immer für alle Spieler löschst, wird - da die Variablen leer sind - auch immer das Label mit der ID 0 mit gelöscht.
    Gleiches Phänomen sollte sich bei den Pickups darstellen.


    Folgende Änderungen musst du machen:
    1) Den Timer nur für einen Spieler aufrufen, sonst führt das bei mehreren Spielern zu Fehlern.
    2) Den Timer nur einmal starten, nicht dauerhaft.
    3) Die Arrays mit -1 als "leer" deklarieren.


    Die Änderungen habe ich jeweils kommentiert.


    Ändere also den Teil von:
    if(Spieler[playerid][Krankenhaus] == 1)
    {
    new string[256],hours,minutes;
    gettime(hours, minutes);
    TotenKopf[playerid] = CreatePickup(1254,1, Spieler[playerid][Pos_x],Spieler[playerid][Pos_y],Spieler[playerid][Pos_z]);
    format(string, sizeof(string), "Gestorben\n%s\n%d:%d", SpielerName(playerid),hours,minutes);
    TotenKopfLabel[playerid] = Create3DTextLabel(string,COLOR_WEISS, Spieler[playerid][Pos_x],Spieler[playerid][Pos_y],Spieler[playerid][Pos_z], 20, 0, 1);
    SetTimer("KHtimer",180000,1);
    FreezePlayer(playerid);
    ResetPlayerWeapons(playerid);
    SetPlayerPos(playerid,2040.5,-1406.0,23.200);
    SetPlayerCameraPos(playerid, 2003.300, -1474.800, 46.4000);
    SetPlayerCameraLookAt(playerid, 2038.5000, -1405.3000, 20.2999);
    SetPlayerInterior(playerid, 0);
    ClearPlayerChat(playerid,20);
    SendClientMessage(playerid,COLOR_WEISS,"Du bist gestorben und wirst behandelt. Das dauert 3 Minuten.");
    SendClientMessage(playerid,COLOR_WEISS,"Wenn du Offline gehst wird die Zeit wieder auf 3 Minuten gesetzt.");
    GameTextForPlayer(playerid, "~y~Krankenhaus~n~~g~3 Minuten", 4000, 1);
    }
    zu:
    if(Spieler[playerid][Krankenhaus] == 1)
    {
    new string[256],hours,minutes;
    gettime(hours, minutes);
    if(TotenKopf[playerid] != -1) DestroyPickup(TotenKopf[playerid]); //Zur Sicherheit prüfen wir ob es noch nicht gelöscht ist.
    TotenKopf[playerid] = CreatePickup(1254,1, Spieler[playerid][Pos_x],Spieler[playerid][Pos_y],Spieler[playerid][Pos_z]);
    format(string, sizeof(string), "Gestorben\n%s\n%d:%d", SpielerName(playerid),hours,minutes);
    if(TotenKopfLabel[playerid] != Text3D:-1) Delete3DTextLabel(TotenKopfLabel[playerid]); //Zur Sicherheit prüfen wir ob es noch nicht gelöscht ist.
    TotenKopfLabel[playerid] = Create3DTextLabel(string,COLOR_WEISS, Spieler[playerid][Pos_x],Spieler[playerid][Pos_y],Spieler[playerid][Pos_z], 20, 0, 1);
    if(TotenKopfTimer[playerid] != -1) KillTimer(TotenKopfTimer[playerid]); //Zur Sicherheit prüfen wir ob der Timer nicht schon aktiv ist.
    TotenKopfTimer[playerid] = SetTimerEx("KHtimer",180000,false,"d", playerid); //Der Timer wird nur für die playerid gestartet, außerdem wird er vermerkt und nur einmal (false) gestartet.
    FreezePlayer(playerid);
    ResetPlayerWeapons(playerid);
    SetPlayerPos(playerid,2040.5,-1406.0,23.200);
    SetPlayerCameraPos(playerid, 2003.300, -1474.800, 46.4000);
    SetPlayerCameraLookAt(playerid, 2038.5000, -1405.3000, 20.2999);
    SetPlayerInterior(playerid, 0);
    ClearPlayerChat(playerid,20);
    SendClientMessage(playerid,COLOR_WEISS,"Du bist gestorben und wirst behandelt. Das dauert 3 Minuten.");
    SendClientMessage(playerid,COLOR_WEISS,"Wenn du Offline gehst wird die Zeit wieder auf 3 Minuten gesetzt.");
    GameTextForPlayer(playerid, "~y~Krankenhaus~n~~g~3 Minuten", 4000, 1);
    }


    Ändere dann den Timer von
    forward KHtimer();
    public KHtimer()
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    Spieler[i][Krankenhaus] = 0;
    SpawnPlayerEx(i);
    ClearPlayerChat(i,20);
    SendClientMessage(i,COLOR_GRUEN,"Du wurdest behandelt.");
    DestroyPickup(TotenKopf[i]);
    Delete3DTextLabel(TotenKopfLabel[i]);
    }
    return 1;
    }
    zu:
    forward KHtimer(playerid); //Timer nur für playerid.
    public KHtimer(playerid)
    {
    if(Spieler[playerid][Krankenhaus] != 0) //Spieler wird nur gespawnt, wenn er im Krankenhaus ist.
    {
    Spieler[playerid][Krankenhaus] = 0;
    SpawnPlayerEx(playerid);
    ClearPlayerChat(playerid,20);
    SendClientMessage(playerid,COLOR_GRUEN,"Du wurdest behandelt.");
    }
    //Entsprechende Löschungen und Variablen "leeren".
    if(TotenKopf[playerid] != -1) DestroyPickup(TotenKopf[playerid]);
    TotenKopf[playerid] = -1;
    if(TotenKopfLabel[playerid] != Text3D:-1) Delete3DTextLabel(TotenKopfLabel[playerid]);
    TotenKopfLabel[playerid] = Text3D:-1;
    TotenKopfTimer[playerid] = -1;
    return 1;
    }


    Ändere dann die Deklaration der Array von:
    new TotenKopf[MAX_PLAYERS];
    new Text3D:TotenKopfLabel[MAX_PLAYERS];
    zu:
    //Das -1,... steht für alle Indizes im Array.
    new TotenKopf[MAX_PLAYERS] = {-1,...};
    new Text3D:TotenKopfLabel[MAX_PLAYERS] = {Text3D:-1,...};
    new TotenKopfTimer[MAX_PLAYERS] = {-1,...};


    Füge außerdem zu OnPlayerDisconnect das hier hinzu:
    //Lösche und leere jeweils die Variablen, sofern belegt.
    if(TotenKopf[playerid] != -1) DestroyPickup(TotenKopf[playerid]);
    TotenKopf[playerid] = -1;
    if(TotenKopfLabel[playerid] != Text3D:-1) Delete3DTextLabel(TotenKopfLabel[playerid]);
    TotenKopfLabel[playerid] = Text3D:-1;
    if(TotenKopfTimer[playerid] != -1) KillTimer(TotenKopfTimer[playerid]);
    TotenKopfTimer[playerid] = -1;



    Besonders bei Timern ist es enorm wichtig, diese korrekt zu beenden, damit die nicht parallel weiterlaufen. Das führt sonst garantiert zu Fehlern im Spielablauf, die extrem schwer nachzuvollziehen sind.

    Das weiß ich nicht, ich schätze nicht, da das ja auch nicht mehr als die vorhandenen Funktionen nutzen kann.
    Das einzige was du machen kannst ist, viele Textdraws mit entsprechenden Farben auf 1 Pixel Breite (oder Höhe, je nach dem) hintereinander zu setzen, mit entsprechendem Farbverlauf. Würde halt ne Menge an Textdraws benötigen.

    Ist ja komisch.
    Was wird dir so ausgegeben?
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    printf("OnDialogResponse");
    printf("dialogid: %d == %d DLG_JOB", dialogid, DLG_JOB);
    if(dialogid == DLG_JOB)
    {
    printf("DLG_JOB");
    if(response)
    {
    printf("response");
    switch(listitem)
    {
    case 0:
    {
    printf("0");
    new rand = random(sizeof Cp);
    SetPlayerCheckpoint(playerid,Cp[rand][0],Cp[rand][1],Cp[rand][2],1);
    SendClientMessage(playerid,0x33CCFFAA,"1 klappt");
    mCP[playerid] = 1;
    K[playerid] = 1;
    SetPlayerSkin(playerid,158);
    return 1;
    }
    case 1:
    {
    printf("1");
    for(new i;i<sizeof frCars;i++)
    {
    if(inFrUse[fCar[i]] != -1)continue;
    SetPlayerCheckpoint(playerid,frCars[i][0],frCars[i][1],frCars[i][2],5);
    inFrUse[i] = playerid;
    return SendClientMessage(playerid,0x33CCFFAA,"2 klappt");
    }
    return SendClientMessage(playerid,0xFF6347AA,"belegt");
    }
    }
    }
    }
    return 0;
    }

    Was wird dir so im Server Log geprintet?
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    printf("OnDialogResponse");
    switch(dialogid)
    {
    case DLG_JOB:
    {
    printf("DLG_JOB");
    if(response)
    {
    printf("response");
    switch(listitem)
    {
    case 0:
    {
    printf("0");
    new rand = random(sizeof Cp);
    SetPlayerCheckpoint(playerid,Cp[rand][0],Cp[rand][1],Cp[rand][2],1);
    SendClientMessage(playerid,0x33CCFFAA,"1 klappt");
    mCP[playerid] = 1;
    K[playerid] = 1;
    SetPlayerSkin(playerid,158);
    return 1;
    }
    case 1:
    {
    printf("1");
    for(new i;i<sizeof frCars;i++)
    {
    if(inFrUse[fCar[i]] != -1)continue;
    SetPlayerCheckpoint(playerid,frCars[i][0],frCars[i][1],frCars[i][2],5);
    inFrUse[i] = playerid;
    return SendClientMessage(playerid,0x33CCFFAA,"2 klappt");
    }
    return SendClientMessage(playerid,0xFF6347AA,"belegt");
    }
    }
    }
    }
    }
    return 0;
    }