Hallo, ich habe ein Riesenproblem, welches ich einfach nicht behoben bekommen, es sieht so aus:
Kleine Vorgeschichte: Auf dem Server sind 2 Leute (ID 0 und ID 1)
Nun connecte ich auf den Server (als ID 2), dann sehe ich den Tacho von ID 0, wenn ID 0 jetzt von seinem Fahrzeug absteigt, sehe ich für eine Sekunde keinen Tacho, danach den von ID 1, wenn ID 0 jetzt wieder in in das Fahrzeug steigt, sehe ich den Tacho von ID 0 und ID 1, welche sich beide auch jede Sekunde aktualisieren
Wenn ich jetzt noch selbst in ein Fahrzeug steige, sehe ich 3 Tachos, die sich alle 3 auch aktualisieren
Code ("maxon" steht für 32):
//ganz oben:
new Text:sprit[maxon];
//OnPlayerConnect:
sprit[playerid]=TextDrawCreate(250.0, 395.0," ");
for(new i=0; i<maxon; i++) {
TextDrawHideForPlayer(playerid,sprit[i]); }
//OnPlayerDisconnect:
TextDrawHideForPlayer(playerid,sprit[playerid]);
TextDrawDestroy(sprit[playerid]);
//bei /login:
TextDrawSetString(sprit[playerid]," ");
for(new i=0; i<maxon; i++) {
TextDrawHideForPlayer(playerid,sprit[i]); }
//bei OnPlayerSpawn
for(new i=0; i<maxon; i++) {
TextDrawHideForPlayer(playerid,sprit[i]); }
//im timer:
//bei den "[...]" steht nichts für den TextDraw relevantes und "aid" steht für "Autoid", also "new aid=GetPlayerVehicleID(i);"
[...]
format(sstring,sizeof(sstring),"Kraftstoff: %.2f/60.00 Liter~n~Geschwindigkeit: %d km/h~n~Fahrzeug: %s~n~Zustand: %s~n~Kilometerstand: %.2f",fi[aid][tank],floatround(distanz),autonamen[mid-400],zs,fi[aid][kmstand]);
TextDrawSetString(sprit[i],sstring);
[...]
//OnPlayerStateChange:
//newstate==2:
TextDrawShowForPlayer(playerid,sprit[playerid]);
//oldstate==2
TextDrawSetString(sprit[playerid]," ");
TextDrawHideForPlayer(playerid,sprit[playerid]);
Ich hoffe, dass mir jemand helfen kann, ich verzweifel daran
Man sieht den Tacho von jmd anderen
- KeksOfDeath
- Geschlossen
- Erledigt
-
-
wie ist maxon definiert?
-
#define maxon 32
Steht ganz oben -
ok aber könntest du noch den Timer komplett posten?
-
Müsstest du nicht i in playerid umschreiben?
i gilt ja für alle Spieler -
das könnte die Lösung sein nur
man sieht auch nicht genau wie er es strukturiert hat -
man sieht auch nicht genau wie er es strukturiert hat
Er soll ja nicht alles posten, damit sich iwer das klauen kann und das für sein Script nehmen kann
-
Der Teil vom Timer müsste reichen...
Spoiler anzeigen
new aid=GetPlayerVehicleID(i);
if(GetPlayerState(i)==PLAYER_STATE_DRIVER) {
if(benziner(aid)) {
new sstring[160], Float:jx, Float:jy, Float:jz, mid=GetVehicleModel(aid);
GetPlayerPos(i,jx,jy,jz);
new Float:distanz=floatsqroot(floatpower(floatabs(floatsub(jx,ax[i])),2)+floatpower(floatabs(floatsub(jy,ay[i])),2)+floatpower(floatabs(floatsub(jz,az[i])),2));
distanz=floatround(distanz*3000);
distanz=floatround(distanz/1000);
new zs[20], Float:aleben;
GetVehicleHealth(aid,aleben);
if(aleben<=249) {
fi[aid][istkaputt]=1;
SendClientMessage(i,rot,"Dein Fahrzeug ist stark beschädigt, verlasse es mit /aussteigen und rufe das Ordnungsamt an mit der Nummer 111");
SetVehicleHealth(aid,250);
TogglePlayerControllable(i,0);
fi[aid][motor]=0;
}
if(aleben>=1000) { format(zs,sizeof(zs),"perfekt"); }
else if(aleben>=750) { format(zs,sizeof(zs),"gut"); }
else if(aleben>=500) { format(zs,sizeof(zs),"durchschnittlich"); }
else if(aleben>=350) { format(zs,sizeof(zs),"schlecht"); }
else if(aleben<350) { format(zs,sizeof(zs),"katastrophal"); }
if(fi[aid][istan]==1) {
fi[aid][kmstand]+=distanz/1000; }
if(fi[aid][istan]==0) { fi[aid][istan]=1; }
if(pi[i][machtautoschein]>=1 || pi[i][machtmotorradschein]>=1) {
if(aleben<=250) {
RemovePlayerFromVehicle(i);
DestroyVehicle(pi[i][fahrauto]);
SendClientMessage(i,gelb,"|________Ergebnis________|");
SendClientMessage(i,blau,"Du hast wegen zu großer Beschädigung des Fahrzeuges nicht bestanden");
SendClientMessage(i,blau,"Die Prüfungsgebühr, sowie die Reperatur des Fahrzeuges musst du trotzdem zahlen. Dies sind 500$");
GivePlayerGeld(i,-500);
SetPlayerInterior(i,3);
SetPlayerPos(i,-2022.138305,-116.718391,1035.171875); }
if(pi[i][automostrecke]<=14 || pi[i][automostrecke]>=19) {
if(floatround(distanz)>=100) {
pi[i][fehlerpunkte]++; }}}
//--------------------------------------------------------------------------
if(fi[aid][motor]==1) {
if(fi[aid][tank]>0) {
fi[aid][tank]-=distanz*0.0004+0.001; }
else {
fi[aid][tank]=0;
SendClientMessage(i,blau,"Dein Tank ist leer, nutze /aussteigen um aus dem Fahrzeug zu gelangen");
fi[aid][motor]=0;
TogglePlayerControllable(i,0); }}
//--------------------------------------------------------------------------
format(sstring,sizeof(sstring),"Kraftstoff: %.2f/60.00 Liter~n~Geschwindigkeit: %d km/h~n~Fahrzeug: %s~n~Zustand: %s~n~Kilometerstand: %.2f",fi[aid][tank],floatround(distanz),autonamen[mid-400],zs,fi[aid][kmstand]);
TextDrawSetString(sprit[i],sstring);
ax[i]=jx;
ay[i]=jy;
az[i]=jz;
}
PS: Es läuft für jede Person ein einzelnde Timer, also SetTimerEx (mit SetTimer und dann ner for-player-schleife hab ichs auch schon versucht... funktioniert auch nicht)
PS2: Sollte der gesamte Timerinhalt benötigt werden, postei ch den auch, wollte das jetzt nur nicht, da dieser 300 Zeilen lang ist -
Ersetze doch mal das OnPlayerConnect von
for(new i=0; i<maxon; i++) {
TextDrawHideForPlayer(playerid,sprit[i]); }
zu
TextDrawShowForPlayer(playerid) //kan auch andere Parameter habenVerstehe halt nicht, wieso du jeden Spieler nimmst....
-
Weil ich ja meistens schon beim connecten den Tacho von anderen sehen (wobei es nicht immer die ID 0 ist, sondern eine zufällige)
Also will ich für diese Person den Tacho aller Leute verstecken
//EDIT:
Es ist nicht nur so, dass wenn man mehrere Tachos sieht, dass die dann übereinander hängen, es kann auch sein, dass man einen Tacho für einen ganz kleinen Moment sieht (kann ich nicht in Zeiteinheiten ausdrücken), dann verschwindet der, dafür kommt ein anderer, wieder für einen ganz kleinen Moment, dann verschwindet dier auch wieder und es kommt noch ein Neuer, dieser bleibt dann die Zeit, was von der einen Sekunde (in diesem Zeitraum aktualisiert der Tacho) noch übrig ist -
-
wenn du mit der variable i arbeitest wird es zufällig angewählt...
nimm playerid da er dann daraus nimmt wer grad im fahrzeug sitzt und fährt -
Logischer Denkansatz:
Überprüfe per STR+F alleZitatSetTimerEx
Zitatfor
ZitatShowPlayerTextDraw
-
Den Denkansatz hatte ich auch schon, alles, was mit TextDrawShow zu tun hat:
//OnPlayerConnct:
TextDrawShowForPlayer(playerid,forum);
//OnPlayerStateChange
//newstate==2
TextDrawShowForPlayer(playerid,sprit[playerid]);
Sonst nix mit TextDrawShow, mit TextDrawHide gibts das:
//OnPlayerConnect:
for(new i=0; i<maxon; i++) {
TextDrawHideForPlayer(playerid,sprit[i]); }
//OnPlayerDisconnect:
TextDrawHideForPlayer(playerid,forum);
TextDrawHideForPlayer(playerid,sprit[playerid]);
//OnPlayerSpawn:
for(new i=0; i<maxon; i++) {
TextDrawHideForPlayer(playerid,sprit[i]); }
//OnPlayerDeath:
TextDrawHideForPlayer(playerid,sprit[playerid]);
//oldstate==2
TextDrawHideForPlayer(playerid,sprit[playerid]);
SetTimerEx: gibts nur jeweils 1 Timer, der sich immer wiederholt (1 pro Spieler)
for: Gibt ganz viele, aber keine in i-nem Timer -
breadfish.de
Hat das Thema geschlossen.