Beitrag von JustMe.77 ()
Dieser Beitrag wurde vom Autor gelöscht ().
hier ein anstoß.
new counter,string[124];
for(new i;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i)) counter++;
}
format(string,sizeof(string),"Es wurden %i Spieler markiert.",counter);
SendClientMessage(playerid,-1,string);
/e 1 Beitrag zu spät gesehen
Dein Fehler besteht nur noch darin, dass die Spieler einen falschen Namen angeheftet bekommen?
Das liegt an der Position von GetPlayerName, die eigentlich in die Schleife mit der Spieler-ID 'i' muss.
[...]
if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,0x6FFFFFFF,"The Player is not online");
new str[32];
for(new i=0; i < 20; i++)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i))continue;
GetPlayerName(i, name, sizeof(name));
format(str, sizeof(str), "{%06x} %s",GetPlayerColor(i) >>> 8,name);
playertextid = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,400.0, i, INVALID_VEHICLE_ID, 0);
}
return 1;
}
Nur muss ich ehrlich gestehen, verstehe ich den Sinn des Befehls noch nicht zu 100%.
Du möchtest alle Spieler per Befehl mit TextLabels versehen - Verstanden.
Wessen Name soll denn dort stehen? Der von dem Spieler, dem die Spieler-ID "pID" zugewiesen wurde? Oder der Name des Spielers, der letztendlich markiert wurde?
Hallo.
Versuche das mal so.
if(PRESSED(KEY_ANALOG_LEFT))
{
if(!CheckAdminName(playerid))return 0;
new name[MAX_PLAYER_NAME],str[32];
GetPlayerName(playerid,name,sizeof(name));
format(str,sizeof(str),"{%06x} %s",GetPlayerColor(playerid) >>> 8,name);
for(new i;i<25;i++)
{
DeletePlayer3DTextLabel(playerid,pLabel[playerid][i]);
pLabel[playerid][i] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,400.0,playerid,INVALID_VEHICLE_ID,0);
}
return 1;
}
Alles anzeigen
Möchtest du, das nur jeder sein eigenes TextLabel sehen kann, oder das jeder von jedem das sieht? Falls jeder von jeden sehen soll, dann musst du CreatePlayer3DTextLabel zu Create3DTextLabel ändern, und ggf. die Parameter ändern / löschen.
Hast du meinen Code denn überhaupt ausprobiert? Der müsste eigentlich funktionieren.
Nein ganzer Code hatte aber Fehler enthalten.
for(new i=0; i < 25; i++)
{
new str[32];
pLabel[playerid][i] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,400.0, i, INVALID_VEHICLE_ID, 0);
}
Du gehst die (ich denke mal maximal erstellbaren PlayerLabels für einen Spieler) Labels mit der Schleife durch, und setzt dann für einen Spieler (wobei das i vor INVALID_VEHICLE_ID zu playerid muss) 25 Labels an die gleiche Stelle.
=> EDIT:
Eigentlich müsstest du da noch was ändern, weil das macht meiner Meinung so derzeit keinen Sinn (25 Labels, für einen Spieler an der gleichen Stelle). Ich weiß aber auch nicht genau, was du vor hast.
Dann gehst du aber falsch vor.
Du bräuchtest eine Schleife (Wert: MAX_PLAYERS) und dann nicht mit playerid sondern i (beziehungsweise die entsprechende Schleifen-Variable) arbeiten. Überdenke dein Vorgehen dort nochmals.
Entweder du bringst mich durcheinander, oder du schreibst einfach nur komisch..
Ich erstelle ein Label an alle Spieler und nicht nur an einem Spieler..
Dachte du willst mit einem Knopfdruck an alle Spieler etwas "attachen", deswegen war ich verwirrt.
Die sollen nur sichtbar sein für die Person die die Taste drückt und nicht für jedem.
Das hat mich aber nun aufgeklärt.
Gut, dann machst du das so:
new Player3DText:playerLabel[MAX_PLAYERS] = {-1,...};//global
//bei OnPlayerConnect:
playerLabel[playerid] = -1;
//dein Code:
if(PRESSED(KEY_ANALOG_LEFT))
{
if(!CheckAdminName(playerid))return 0;
new name[MAX_PLAYER_NAME],str[32];
GetPlayerName(playerid,name,sizeof(name));
format(str,sizeof(str),"{%06x} %s",GetPlayerColor(playerid) >>> 8,name);
if(playerLabel[playerid] > -1)DeletePlayer3DTextLabel(playerid,playerLabel[playerid]);
else playerLabel[playerid] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,400.0,playerid,INVALID_VEHICLE_ID,0);
return 1;
}
Alles anzeigen
Du brauchst im Prinzip die 25 Einträge bei pLabel nicht, außer du brauchst das für etwas anderes. Aber bei diesem brauchst du es nicht, deswegen playerLabel[playerid].
Wir reden gerade 30026km aneinander vorbei, kann das sein?
oder erstellt sich mit meinem aktuellen Code an jedem Spieler 25 Labels?
Exakt, das ist es.
Mein letzter Versuch, ansonsten bin ich zu verwirrt in diesem Thema.
if(PRESSED(KEY_ANALOG_LEFT))
{
if(!CheckAdminName(playerid))return 0;
new name[MAX_PLAYER_NAME],str[32];
for(new i;i<MAX_PLAYERS;i++)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i) || playerid == i)continue;
DeletePlayer3DTextLabel(playerid,pLabel[playerid][i]);
GetPlayerName(i,name,sizeof(name));
format(str,sizeof str,"{%06x} %s",GetPlayerColor(i) >>> 8,name);
pLabel[playerid][i] = CreatePlayer3DTextLabel(i,str,0xFF0000FF,0,0,0.2,400.0,i,INVALID_VEHICLE_ID,0);
}
return 1;
}
Alles anzeigen
Die Deklaration von pLabel muss dann so sein:
pLabel[MAX_PLAYERS][MAX_PLAYERS]
Falls das wieder nicht gehen sollte, musst du das eben wieder in den Timer packen. Falls dann immer noch nicht, dann kannst du ja noch mal schreiben, was nicht geht, vielleicht schaffe ich es ja noch oder jemand anders.
Ihr habt nur vergessen diese Funktion zu verwenden: https://wiki.sa-mp.com/wiki/Attach3DTextLabelToPlayer_DE