Beitrag von JustMe.77 ()
Dieser Beitrag wurde vom Autor gelöscht ().
Hey,
wenn ich es Richtig sehe Slapst du dich hoch und das Textdraw geht noch.
wenn du aber Neu Joinst und dich wieder Slapst dann buggt das Textdraw ?
Probiert mal dich zu Slapen und direkt nach dem Reconnect ihne zu Slapen das Textdraw Öffnen ist es dann auch verbuggt ?
Was mir ins Auge springt ist folgende Zeile:
SpecText[4][playerid] = PlayerText:INVALID_TEXT_DRAW;
Ich habe auch immer wieder Probleme mit den TextDraws. Ich habe einfach eine eigene Funktion geschrieben: _TextDrawDestroy(...) wo ich dann die jeweilige id auf INVALID setze.
Probier aber erstmal die oben aufgeführte Zeile zu korrigieren
Wenn ich das nun richtig sehe ist die Variable folgender maßen:
SpecText[MAX_PLAYERS][4];
wenn du nun den Wert zurücksetzen willst:
for(new p = 0; p < 4; p++) SpecText[playerid][p] = PlayerText:INVALID_TEXT_DRAW;
Die Schleife ist nur eine Abkürzung. Du hast das einmal richtig gemacht und beim 2. mal aufeinmal falsch.
wenn du hast: SpecText[MAX_PLAYERS][4];
aber auf SpecText[4][playerid] zugreifst. Dann könnte sogar dein Script abschmieren (wenn deine playerid höher als 3 ist.
Denn du greifst auf den Text von playerid 4 zu und davon das Element an stelle von playerid (es gibt aber nur 4 (0-3).
Du musst also alle 4 Spec-Texte für den jeweiligen Spieler zurücksetzen.
Der richtige Zugriff wäre also:
SpecText[playerid][0]
SpecText[playerid][1]
SpecText[playerid][2]
SpecText[playerid][3]
Oder wie in meinem vorherigen Post einfach eine kleine Schleife machen. Ist am Ende genau das selbe.
Es kommt halt auch darauf an, an welcher Stelle Textdraws erstellt werden, an welcher stelle sie gezeigt werden und an welcher stelle sie zerstört werden.
Ich würde es folgendermaßen machen:
Wenn der Spieler sich einloggt, erstellst du die benötigten PlayerTextDraws.
An geeignetet Stelle zeigst du dem Spieler das TextDraw mit PlayerTextDrawShow
Wenn der Spieler sich ausloggt, dann zerstörst du das TextDraw und setzt den Wert der Variablen zurück.
Beispiel:
PlayerText:beispiel[MAX_PLAYERS] = {PlayerText:INVALID_TEXT_DRAW, ...};
public OnPlayerConnect(playerid)
{
beispiel[playerid] = PlayerTextDrawCreate(...);
//Eigenschaften
return 1;
}
//Irgentein Ereignis
{
PlayerTextDrawShowForPlayer(playerid, beispiel[playerid]);
}
//Ereignis ist nicht mehr da
{
PlayerTextDrawHideForPlayer(playerid, beispiel[playerid]);
}
OnPlayerDisconnect(playerid, reason[])
{
PlayerTextDrawDestroy(beispiel[playerid]);
beispiel[playerid] = PlayerText:INVALID_TEXT_DRAW;
return 1;
}
Alles anzeigen
Es kann sein das paar Parameter falsch sind oder die Funktionen etwas anders geschrieben werden, aber grundsätzlich sollte das verständlich sein.
Damit ist sichergestellt, das das Textdraw erst beim Connecten erstellt wird. Dann wann es ihm angezeigt oder nicht angezeigt werden soll, wird das getan.
Beim Ausloggen wird das TextDraw dann zerstört und die Variable zurück gesetzt.
Loggt der Spieler sich nun wieder ein (oder ein anderer) werden die TextDraws wieder neu erstellt.
Nach diesem Prinzip alle TextDraws machen.
Bei allgemeinen übrigens auch: beim GameModeInit erstellen, an geeigneter Stelle anzeigen oder verstecken. Und beim GameModeExit zerstören.
Wenn du zwischendurch ohne relog Textdraws erstellst und zerstörtst, darauf achten, das beim zerstören immer die Variablen zurückgesetzt werden.