Problem mit Krankenhaus und Death Pickup

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
  • Guten abend,


    Ich hab ein problem und zwar wenn der Spieler stirbt soll ein pickup auftauchen mit einen 3DTextLabel wird ja auch alles gemacht wird angezeigt schön und gut
    das problem ist wenn der spieler aus dem Krankenhaus raus kommt also spawnt wird ihn am spawn der 3DTextLabel von fahrrad verleih nicht angezeigt obwohl es woher angezeigt hat wo der spieler noch nicht gestorben ist


    Code:




    Wenn er ins krankenhaus kommt spawn


    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);
    }


    timer
    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;
    }


    Der fahrrad verleih text
    Create3DTextLabel("{0076FF}Fahrradverleih{FFFFFF}\nHier kannst du dir ein {0076FF}Fahrrad{FFFFFF} für{0076FF} $100{FFFFFF} mieten.\nTippe: {0076FF}/fahrrad", 0xFFFFFFFF, 2150.2666,-1902.2662,13.5505, 10.0, 0, 0);


    wenn spieler stirbt
    StopAudioStreamForPlayer(playerid);
    if(IsPlayerNPC(playerid))return 1;
    new Float:pX,Float:pY,Float:pZ;
    GetPlayerPos(playerid, pX, pY, pZ);
    new hours,minutes;
    gettime(hours, minutes);
    Spieler[playerid][Krankenhaus] = 1;
    //TotenKopf[playerid] = CreatePickup(1254,1, pX, pY, pZ);
    //format(string, sizeof(string), "Gestorben\n%s\n%d:%d", SpielerName(playerid),hours,minutes);
    //TotenKopfLabel[playerid] = Create3DTextLabel(string,COLOR_WEISS, pX,pY,pZ, 5, 0, 1);
    Spieler[playerid][Pos_x] = pX;
    Spieler[playerid][Pos_y] = pY;
    Spieler[playerid][Pos_z] = pZ;
    Spieler[killerid][Morde] ++;
    Spieler[playerid][Gestorben] ++;



  • 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.