[SAMMELTHREAD] Kleine Scripting Fragen
- Rafelder
- Unerledigt
-
-
GetPlayerName(playerid, name, sizeof(name));
zu:
GetPlayerName(pID, name, sizeof(name));Aber das darf erst nach der IsPlayerConnected Abfrage kommen.
-
Klappt nun, danke erneut
Kann ich die Farbe nach der Namensfarbe des Spielers ändern? Oder ist das nicht möglich?
Ich habs so gemacht, das funktioniert aber nicht.
format(str, sizeof(str), "{%06x} %s", name,GetPlayerColor(playerid) >>> 8); playertextid = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 1);
Edit: Fehler gefunden.
Lösung: Habe name und GetPlayerColor vertauscht.
Kleine Frage: Wie frage ich ab ob der Spieler schon markiert ist? -
Beitrag von Jeffry ()
Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: ^ (). -
Kleine Frage: Wie frage ich ab ob der Spieler schon markiert ist?
Dazu musst du dann das Array anlegen (unter den Includes):
new PlayerText3D:pLabel[MAX_PLAYERS][MAX_PLAYERS];und es so abfragen:
if(pLabel[playerid][pID] != PlayerText3D:-1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du hast diesem Spieler bereits ein Label gesetzt.");
pLabel[playerid][pID] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 1);Bei OnPlayerConnect:
for(new i = 0; i < MAX_PLAYERS; i++) pLabel[playerid][i] = PlayerText3D:-1;Beim Löschen die Variable entsprechend auch auf -1 setzen.
-
Beitrag von malE ()
Dieser Beitrag wurde vom Autor gelöscht (). -
Damit erhalte ich Errors @Jeffry
CMD:paint(playerid,params[])
{
if(!CheckAdminName(playerid)) return 0;
new pID, tmp[20], idx;
tmp = strtok(params, idx);
new name[MAX_PLAYER_NAME];
new Float:X, Float:Y, Float:Z;
GetPlayerPos(playerid, X, Y, Z);
if(!strlen(tmp)) return SendClientMessage(playerid,0x6FFFFFFF,"ERROR:: /paint [ID]");
if(IsNumeric(tmp)) pID = strval(tmp);
else pID = ReturnPlayerID(tmp);
if(pLabel[playerid][pID] != PlayerText3D:-1) return SendClientMessage(playerid, -1, "Error: Du hast diesem Spieler bereits ein Label gesetzt.");
pLabel[playerid][pID] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 1)
if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,0x6FFFFFFF,"The Player is not online");
GetPlayerName(pID, name, sizeof(name));
new str[32];
format(str, sizeof(str), "{%06x} %s",GetPlayerColor(pID) >>> 8,name);
pLabel = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 0);
return 1;
}C:\Users\David\Desktop\stuff\filterscripts\test1.pwn(33) : error 035: argument type mismatch (argument 2)
C:\Users\David\Desktop\stuff\filterscripts\test1.pwn(61) : error 017: undefined symbol "str"
C:\Users\David\Desktop\stuff\filterscripts\test1.pwn(62) : error 001: expected token: ";", but found "if"
C:\Users\David\Desktop\stuff\filterscripts\test1.pwn(66) : error 033: array must be indexed (variable "pLabel")
Pawn compiler 3.10.20150531 Copyright (c) 1997-2006, ITB CompuPhase4 Errors.
-
CMD:paint(playerid,params[])
{
if(!CheckAdminName(playerid)) return 0;
new pID, tmp[20], idx, str[32];//
tmp = strtok(params, idx);
new name[MAX_PLAYER_NAME];
new Float:X, Float:Y, Float:Z;
GetPlayerPos(playerid, X, Y, Z);
if(!strlen(tmp)) return SendClientMessage(playerid,0x6FFFFFFF,"ERROR:: /paint [ID]");
if(IsNumeric(tmp)) pID = strval(tmp);
else pID = ReturnPlayerID(tmp);
if(pLabel[playerid][pID] != PlayerText3D:-1) return SendClientMessage(playerid, -1, "Error: Du hast diesem Spieler bereits ein Label gesetzt.");
pLabel[playerid][pID] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 1);// Hier hast du ein Semikolon vergessen
if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,0x6FFFFFFF,"The Player is not online");
GetPlayerName(pID, name, sizeof(name));
format(str, sizeof(str), "{%06x} %s",GetPlayerColor(pID) >>> 8,name);
pLabel = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 0);
return 1;
} -
-
CMD:paint(playerid,params[])
{
if(!CheckAdminName(playerid)) return 0;
new pID, tmp[20], idx;
tmp = strtok(params, idx);
if(!strlen(tmp)) return SendClientMessage(playerid,0x6FFFFFFF,"ERROR:: /paint [ID]");
if(IsNumeric(tmp)) pID = strval(tmp);
else pID = ReturnPlayerID(tmp);
if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,0x6FFFFFFF,"The Player is not online");
if(pLabel[playerid][pID] != PlayerText3D:-1) return SendClientMessage(playerid, -1, "Error: Du hast diesem Spieler bereits ein Label gesetzt.");
new name[MAX_PLAYER_NAME];
GetPlayerName(pID, name, sizeof(name));
new str[32];
format(str, sizeof(str), "{%06x} %s",GetPlayerColor(pID) >>> 8,name);
pLabel[playerid][pID] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 1);
return 1;
} -
-
Es erscheint die Meldung das ich bereits ein Label gesetzt habe, obwohl das nicht der Fall ist.
for(new i = 0; i < MAX_PLAYERS; i++) pLabel[playerid][i] = PlayerText3D:-1;
Hast du das bei OnPlayerConnect eingefügt?PS: Du hast bei Zeile 15 den Simikolon vergessen
Oh, stimmt, das habe ich nicht gesehen. Das habe ich von dir einfach so mitkopiert.
-
-
Setze da mal einen print hin, wird der Code überhaupt aufgerufen?
-
Komisch, OnPlayerConnect wird nicht aufgerufen. Ich habe alles im FilterScript erstellt und benutze das bare Script.
Da ich aber das FS für alle Server kompatibel machen möchte und nicht jedes mal aufs Script zugreifen möchte, habe ich eine Idee wie man es anders lösen könnte, nur weiß
ich nicht genau wie ich das zu machen habe.Ich möchte mit dem Befehl abfragen ob er bereits einen Label hat, wenn ja, dann soll der Label einmal gelöscht werden und wieder erstellt werden.
Dafür bräuchte ich dann nicht die Abfrage in OnPlayerConnect, oder doch? So hätte ich es sowieso lieber, nur weiß ich nicht genau wie ich das anstellen soll @Jeffry -
Dafür bräuchte ich dann nicht die Abfrage in OnPlayerConnect, oder doch?
Doch, um den Wert auf -1 zu setzen.
Schau mal in dem Gamemode, bzw. in anderen Filterscripts die du noch nutzt, ob OnPlayerConnect dort 0 zurück gibt (return 0). Falls ja, ändere das zu return 1.
-
Es sind nebenbei keine andere FilterScripts am laufen, und im Gamemode returnt OnPlayerConnect 1.
Vielleicht kann man das ja auch anders abfragen.-1 steht für der Spieler hat kein Label, welche Zahl steht dafür das er bereits einen hat (xx)?
Dann würde ich das so machen und abfragen ob die Zahl xx == xx ist. -
-1 steht für der Spieler hat kein Label, welche Zahl steht dafür das er bereits einen hat (xx)?
Eine Zahl von 0 bis zum Maximum an erstellbaren Player-Labels heißt, dass er eines hat. Da 0 aber der Standard-Wert der Variable ist, geht das nicht abzufragen, da es auch ein Label mit der ID 0 gibt.
Alternativ, falls du das OnPlayerConnect nicht aufgerufen bekommst, mache es so:
new PlayerText3D:pLabel[MAX_PLAYERS][MAX_PLAYERS];
new bool:pLabelSet[MAX_PLAYERS][MAX_PLAYERS];if(pLabelSet[playerid][pID]) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du hast diesem Spieler bereits ein Label gesetzt.");
pLabel[playerid][pID] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 1);
pLabelSet[playerid][pID] = true;Und beim Löschen bzw. beim Disconnect:
pLabelSet[playerid][pID] = false; -
Endlich funktioniert es :)!
Nur habe ich noch eine kleine Frage, ich sagte ja bereits das ich wenn der Spieler bereits ein Label hat, diesen löschen und wieder erstellen möchte.
Ist das so korrekt oder kann man das auch besser machen?CMD:paint(playerid,params[])
{
if(!CheckAdminName(playerid)) return 0;
new str[32];
new pID, tmp[20], idx;
tmp = strtok(params, idx);
if(!strlen(tmp)) return SendClientMessage(playerid,0x6FFFFFFF,"ERROR:: /paint [ID]");
if(IsNumeric(tmp)) pID = strval(tmp);
else pID = ReturnPlayerID(tmp);
if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,0x6FFFFFFF,"The Player is not online");
if(pLabelSet[playerid][pID])
{
pLabelSet[playerid][pID] = false;
pLabel[playerid][pID] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 1);
pLabelSet[playerid][pID] = true;
new name[MAX_PLAYER_NAME];
GetPlayerName(pID, name, sizeof(name));
format(str, sizeof(str), "{%06x} %s",GetPlayerColor(pID) >>> 8,name);
}
pLabel[playerid][pID] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 1);
pLabelSet[playerid][pID] = true;
new name[MAX_PLAYER_NAME];
GetPlayerName(pID, name, sizeof(name));
format(str, sizeof(str), "{%06x} %s",GetPlayerColor(pID) >>> 8,name);
return 1;
} -
Naja du könntest sscanf nutzen bei deinem Befehl sonst sind paar kleine Fehler drin
Code
Alles anzeigenCMD:paint(playerid,params[]) { if(!CheckAdminName(playerid)) return 0; new str[32]; new pID, tmp[20], idx; tmp = strtok(params, idx); if(!strlen(tmp)) return SendClientMessage(playerid,0x6FFFFFFF,"ERROR:: /paint [ID]"); if(IsNumeric(tmp)) pID = strval(tmp); else pID = ReturnPlayerID(tmp); if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,0x6FFFFFFF,"The Player is not online"); new name[MAX_PLAYER_NAME]; GetPlayerName(pID, name, sizeof(name)); if(pLabelSet[playerid][pID]) { pLabel[playerid][pID] = CreatePlayer3DTextLabel(playerid,str,0xFF0000FF,0,0,0.2,350.0, pID, INVALID_VEHICLE_ID, 1); pLabelSet[playerid][pID] = true; } else { DeletePlayer3DTextLabel(playerid, pLabel[playerid][pID]); pLabelSet[playerid][pID] = false; } format(str, sizeof(str), "{%06x} %s",GetPlayerColor(pID) >>> 8,name); SendClientMessage(playerid,-1,str); return 1; }