hi, habe mal eine Frage:
Grundsätzlich ist es ja sinnvoller Textdraws Global zu erstellen, da man die dann ja nur anzeigen lassen muss.
Wann ist es jetzt sinnvoll PlayerTextdraws zu erstellen?
hi, habe mal eine Frage:
Grundsätzlich ist es ja sinnvoller Textdraws Global zu erstellen, da man die dann ja nur anzeigen lassen muss.
Wann ist es jetzt sinnvoll PlayerTextdraws zu erstellen?
Hi, mal eine kleine Frage zu Textdraws:
Wie viele empfehlt ihr da für einen Server ungefähr?
Es sieht ja immer sehr gut aus, statt z.b Dialogen Textdraws zu machen.
Aber bis zu welcher Anzahl denkt ihr ist es unproblematisch
ah stimmt ja, Danke
Hi, ich habe Ein/Ausgänge für Gebäude gemacht, funktioniert auch alles, nur das Textlabel wird nur für das erste Gebäude angezeigt..
enum buildingseinausgang
{
Float:b_x,
Float:b_y,
Float:b_z,
Float:b_ix,
Float:b_iy,
Float:b_iz,
b_interior,
b_textlabel[50]
}
new bInfo[][buildingseinausgang] =
{
{1368.6273,-1280.5808,13.5469,286.1099,-41.6369,1001.5156,1,"Ammunation"},//Ammunation 1
{1199.4166,-918.4718,43.1197,363.4129,-74.5786,1001.5078,10,"Burger Shot North"},//BSN
{810.9952,-1616.1310,13.5469,363.4129,-74.5786,1001.5078,10,"Burger Shot South"},//BSS
{2105.1135,-1806.5177,13.5547,372.3520,-131.6510,1001.4922,5,"Pizza"},//Pizzaladen
{1352.3075,-1758.8136,13.5078,-25.884499,-185.868988,1003.549988,17,"24/7"},//24/7 beim LSPD
{1315.5377,-898.2038,39.5781,-25.884499,-185.868988,1003.549988,17,"24/7"}//24/7 beim BSN
};
for(new i=0; i<sizeof(bInfo); i++)
{
CreatePickup(1239,1,bInfo[i][b_x],bInfo[i][b_y],bInfo[i][b_z],0);
CreatePickup(1239,1,bInfo[i][b_ix],bInfo[i][b_iy],bInfo[i][b_iz],i);
Create3DTextLabel(bInfo[i][b_textlabel],BLAU,bInfo[i][b_x],bInfo[i][b_y],bInfo[i][b_z],20.0,i,0);
}
Pickups funktionieren, die werden erstellt für alle, nur das Textlabel geht nur für das 1:Ammunation
Okay, Danke
Schon probiert.
Sry, habe auch vergessen mein Problem zu posten:
Text usw. wird angezeigt, nur das Textlabel nicht.
Hi, weiß jemand was hier daran falsch ist?
ocmd:aduty(playerid,params[])
{
new text[60], Text3D:Aduty[MAX_PLAYER_NAME], Float:X, Float:Y, Float:Z;
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,MAX_PLAYER_NAME);
if(!IsPlayerAnAdmin(playerid,3))return SendClientMessage(playerid, ROT, "Du bist kein Admin oder dein Rang ist zu niedrig!");
if(GetPVarInt(playerid,"AdmDuty")==0)
{
format(text,sizeof(text),"%s ist ADuty gegangen!",name);
GetPlayerPos(playerid,X,Y,Z);
Aduty[playerid] = Create3DTextLabel("Admin im Dienst, DM verboten!",ROT,X,Y,Z,50.0,0,0);
Attach3DTextLabelToPlayer(Aduty[playerid],playerid,0.0,0.0,0.75);
SetPlayerHealth(playerid,100);
SetPVarInt(playerid,"AdmDuty",1);
SendClientMessageToAll(ROT,text);
SendClientMessage(playerid,ROT,"Du bist ADuty gegangen [/aduty]!");
return 1;
}
else
{
format(text,sizeof(text),"%s ist nun nicht mehr im Admin-Dienst!",name);
Delete3DTextLabel(Aduty[playerid]);
SetPlayerHealth(playerid,100);
SetPVarInt(playerid,"AdmDuty",0);
SendClientMessageToAll(ROT,text);
SendClientMessage(playerid,ROT,"Du bist nun nicht mehr ADuty [/aduty]!");
return 1;
}
}
Und noch etwas, in einem Tutorial habe ich gesehen, dass Text3D:Aduty[MAX_PLAYER_NAME] den Arry MAX_PLAYER_NAME hat,
aber das ist ja ein String in dem der ganze Text vom Textlabel steht oder nicht? Aduty[playerid] = Create3DTextLabel("Admin im Dienst, DM verboten!",ROT,X,Y,Z,50.0,0,0);
Und "MUSS" es dann [playerid] heißen, das verstehe ich irgendwie nicht..
Alles klar, Danke !
Du kannst ihn bei OnPlayerRequestClass in den den spectator Modus setzen, dann sind die Pfeile weg.
TogglePlayerSpectating(playerid, 1);
Und bei der Registrierung/Login wieder zu 0, ohne SpawnPlayer, das wird automatisch gemacht.
funktioniert so, habe aber schon oft gesehen dass man bei der Registrierung mit der Cam rumfliegt,
das würde wenn man den Spieler in Spectator setzt nicht gehen oder ?
Alles anzeigenDas kannste ganz einfach mit einer Array überprüfen, ob er sich gerade einloggt.
Bsp:
Nehmen wir mal an du hast bereits eine Spieler Array.
Fügen wir also zur Liste (enum) noch den Punkt pRequestClass hinzu. (Am besten als boolean)
public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
SetSpawnInfo(playerid,0,0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
PlayerInfo[playerid][pRequestClass] = true; //Gehen wir mal vom Arraynamen PlayerInfo aus.
return 1;
}
Dann musste dein Loginsystem bei OnPlayerSpawn ansetzen.
L.G.
bekommt man dann keine Probleme später mal wenn man den Spieler z.b nach dem Krankenhaus einfach spawnen lassen möchte?
auch bei OnPlayerRequestClass ?
dann ist er ja gespawnt und ich bin noch beim Login Dialog..?
Geht das nur so?
die Skinauswahlleiste ist genau wie vorher da
public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
SetSpawnInfo(playerid,0,0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 1;
}
public OnPasswortResponse(playerid)
{
new num_fields,num_rows;
cache_get_data(num_rows,num_fields,dbverbindung);
if(num_rows==1)
{
sInfo[playerid][eingeloggt] = 1;
SetPlayerScore(playerid,cache_get_field_content_int(0,"level",dbverbindung));
sInfo[playerid][db_id] = cache_get_field_content_int(0,"id",dbverbindung);
SetPlayerMoney(playerid,cache_get_field_content_int(0,"geld",dbverbindung));
sInfo[playerid][adminlevel] = cache_get_field_content_int(0,"adminlevel",dbverbindung);
loadPlayerCars(playerid);
new query[128];
format(query,sizeof(query),"UPDATE user SET eingeloggt='%i' WHERE id='%i'",sInfo[playerid][eingeloggt],sInfo[playerid][db_id]);
mysql_function_query(dbverbindung,query,false,"","");
SetSpawnInfo(playerid,0,0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);//------------------------------------------------------HIER
}
else
{
SendClientMessage(playerid,ROT,"Dein Passwort ist falsch!");
ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Login","Gib bitte dein Passwort ein:","Login","Abbrechen");
}
return 1;
}
Müsste ja eigentlich richtig sein oder?
Funktioniert irgendwie nicht, nur wenn ich bei onplayerrequestclass direkt spawnen lasse. Aber das möchte ich ja nicht..
hi, ich bins wieder.
Und zwar habe ich das Problem dass ich immer noch die Skinauswahl beim Login da habe, also einfach ohne dass ich mich einlogge auf spawnen drücken kann.
Natürlich habe ich schon nachgekuckt und gegoogelt, hat auch geklappt mit setspawninfo bei onplayerrequestclass, aber nur wenn ich bei dem callback auch SpawnPlayer(playerid);
reinschreibe, aber ich möchte natürlich dass er erst wenn er sich eingeloggt hat spawnt, geht das auch?
Hi und zwar habe ich das problem, dass ich bei meinem Textdraw auf Login klicke, dann funktioniert auch alles, bis auf dass
wenn ich gespawnt bin muss ich erst ESC drücken um laufen zu können.
Geht das dann mit einem anderen Befehl oder ist TextDrawHide hier richtig?
public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
if(clickedid != Text:INVALID_TEXT_DRAW)
{
if(clickedid == Textdraw[1])
{
//LOGIN/REGISTER
new name[MAX_PLAYER_NAME],query[128];
GetPlayerName(playerid,name,sizeof(name));
format(query,sizeof(query),"SELECT id,banned FROM user WHERE username='%s'",name);
mysql_function_query(dbverbindung,query,true,"OnUserCheck","i",playerid);
TextDrawHideForPlayer(playerid,Textdraw[0]);
TextDrawHideForPlayer(playerid,Textdraw[1]);
TextDrawHideForPlayer(playerid,Textdraw[2]);
TextDrawHideForPlayer(playerid,Textdraw[3]);
}
else if(clickedid == Textdraw[2])
{
SendClientMessage(playerid,ROT,"Funktion noch nicht fertiggestellt!");
TextDrawHideForPlayer(playerid,Textdraw[0]);
TextDrawHideForPlayer(playerid,Textdraw[1]);
TextDrawHideForPlayer(playerid,Textdraw[2]);
TextDrawHideForPlayer(playerid,Textdraw[3]);
}
else if(clickedid == Textdraw[3])
{
SendClientMessage(playerid,ROT,"Funktion noch nicht fertiggestellt!");
TextDrawHideForPlayer(playerid,Textdraw[0]);
TextDrawHideForPlayer(playerid,Textdraw[1]);
TextDrawHideForPlayer(playerid,Textdraw[2]);
TextDrawHideForPlayer(playerid,Textdraw[3]);
}
}
return 1;
}
Noch etwas, muss man alle neu erstellten public's forwarden?
Habe gesehen dass es hier nicht nötig ist.
ich möchte beim Login / Register mit Textdraws arbeiten, ist es jetzt sinnvoller diese unter OnGameModeInit einfach so zu erstellen:
Textdraw[1] = TextDrawCreate(254.000000, 110.000000, "Login / Register");
oder genau zu dem Zeitpunkt wo man sie braucht erst erstellen:
gPlayerTextDraw[playerid] = CreatePlayerTextDraw(playerid, 10.000000, 141.000000, "MyTextDraw");
such mal in Google nach cameditor, da kannst du schöne Animationen machen.
Dann braucht man ja nicht mehr viel machen außer den Text schreiben.
Hi, ich hätte eine kleine Frage:
wenn man bei einem Befehl zum Beispiel 2 Integer braucht,
wie beim /veh befehl farbe 1 und farbe 2 kann man ja new farbe[2];
und dann kann man farbe[0] und farbe[1] verwenden
funktioniert das auch mit strings?
also wenn ich text1[60] habe und text2[60]
gibts dann irgendwie sowas oder so: text[2][60]
Danke! noch eine kleine Frage dazu warum kann ich hier jetzt
createCar(pID,mID,xc,yc,zc,rc,color1,color2);
color1 und color2 direkt eintragen?
Hier funktioniert das ja so nicht:
ocmd:test(playerid,params[])
{
GetPlayerName(playerid, sendename, 24);
SendClientMessage(playerid,ORANGE,"sendename");
return 1;
}
da man ja den text formatieren muss:
ocmd:test(playerid,params[])
{
new text1[60];
GetPlayerName(playerid, sendename, 24);
format(text1, sizeof(text1), "%s",sendename);
SendClientMessage(playerid,ORANGE,text1);
return 1;
}
Hi, habe gerade ein Problem beim Speichern der Fahrzeugfarben..
Vorher hatte ich es gespeichert ohne Farben, also nur ID und Koordinaten, jetzt möchte ich die Farben auch speichern.
ocmd:veh(playerid,params[])
{
new mID,pID,color1,color2;
if(!IsPlayerAnAdmin(playerid,3))return SendClientMessage(playerid, ROT, "Du bist kein Admin oder dein Rang ist zu niedrig!");
if(sscanf(params,"uiii",pID,mID,color1,color2))return SendClientMessage(playerid,ROT,"Befehl: /veh [PLAYERID] [CARID] [FARBE1] [FARBE2]");
if(mID<400||mID>611)return SendClientMessage(playerid,ROT,"Fahrzeug ID muss zwischen 411 und 611 liegen!");
if(color1<0||color1>126||color2<0||color2>126) return SendClientMessage(playerid,ROT,"Die Farbe muss zwischen 0 und 126 liegen!");
new Float:xc,Float:yc,Float:zc,Float:rc;
GetPlayerPos(pID,xc,yc,zc);
GetPlayerFacingAngle(pID,rc);
createCar(pID,mID,xc,yc,zc,rc,color1,color2);
return 1;
}
createCar(playerid,modelid,Float:x,Float:y,Float:z,Float:r,f1,f2)
{
for(new i=0; i<sizeof(cInfo); i++)
{
if(cInfo[i][id_x]!=0)continue;
GetPlayerName(playerid,cInfo[i][besitzer],24);
cInfo[i][c_x]=x;
cInfo[i][c_y]=y;
cInfo[i][c_z]=z;
cInfo[i][c_r]=r;
cInfo[i][farbe1]=f1;
cInfo[i][farbe2]=f2;
cInfo[i][model]=modelid;
cInfo[i][id_x] = CreateVehicle(modelid,x,y,z,r,f1,f2,-1);
saveCarToDB(playerid,i);
return 1;
}
return 1;
}
saveCarToDB(playerid,carid)
{
new query[128];
format(query,sizeof(query),"INSERT INTO cars (besitzer,model,farbe1,farbe2,x,y,z,r) VALUES ('%i','%i','%i','%i','%f','%f','%f','%f')",sInfo[playerid][id],cInfo[carid][model],cInfo[carid][farbe1],cInfo[carid][farbe2],cInfo[carid][c_x],cInfo[carid][c_y],cInfo[carid][c_z],cInfo[carid][c_r]);
mysql_function_query(dbverbindung,query,false,"","");
return 1;
}
Problem ist jetzt er speichert gar nichts mehr..
Ist hier vll ein Fehler, dass ich hier nicht color1,color2 schreiben darf:
createCar(pID,mID,xc,yc,zc,rc,color1,color2);
Hätte mal eine kleine Frage zu den returns..
Ich zwar meistens wann man return 1 macht,
aber ich verstehe nicht was es bewirkt, kann das jemand vielleicht kurz erklären?
Auf Deutsch bedeutet es ja zurück, aber keine Ahnung wie das gemeint ist
Vielleicht könnte mir jemand anhand dieses Codes erklären, wofür die returns hier sind:
IsPlayerAnAdmin(playerid,alevel)
{
if(sInfo[playerid][adminlevel]>=alevel)return 1;
return 0;
}