Hey Leute
Also, heut hab ich ein doch ziemlich 'vielseitiges' Problem.
Es betrifft die Fahrprüfung der Fahrschule auf meinem Server, an dem ich ab & zu ein wenig herumbastle
Folgendes:
Ich habe für den Spieler einen Kurs erstellt, welcher ihn auf verschiedene Fahrfertigkeiten testet. Dieser besteht aus simplen aufeinander folgenden Checkpoints, welche der Player in einer Zeit von 3:00min abfahren muss. Dabei darf er am Auto so wenig wie möglich Schaden verursachen.
Problem:
Das System funktioniert einwandfrei, außer dem Countdown, der läuft wenn man ihn zum Test auserhalb einer Fahrprüfung startet ganz normal & alles
passt, nur nicht wenn ich ihn dann in die Fahrprüfung einbindet. Mit jedem Checkpoint den ich mit dem Fahrzeug durchfahre wird er schneller - mit dem ersten CP doppelt so schnell, dann dreimal so schnell, usw.
Wechselwirkt der vllt irgendwie mit meinen GameTextForPlayer-Befehlen? Die haben ja auch eine Zeitangabe...
Zweites, eher nebensächlicheres Problem:
Der vorherigen Zahlen des Countdowns bleiben alle im Textdraw stehen, er legt also nur die neuen Zahlen drüber? Kann ich da irgendwas dagegen tun?
Da ich in meinem Script Wert darauf lege meine Funktionen selbst zu programmieren bin ich nicht der Typ, der einfach Scripte kopiert, heißt, was ich hier programmiert habe könnte für den einen oder anderen evtl. etwas primitiv wirken
Zum Script:
1. Der Countdown
new countdown1 = 60;//Sekunden-Anzeige
new countdown2 = 2;//Minuten-Anzeige
forward Pruefung(playerid);
public Pruefung(playerid)
{
if(countdown1 > 0)//Starten des Countdowns
{
new pruefstring[128];
format(pruefstring,sizeof(pruefstring),"Verbleibende~n~Zeit:~n~~b~%d:d",countdown2,countdown1);
TextDrawSetString(PRUEF,pruefstring);//Textdraw Code findet ihr unten
MyTextDraw4(playerid);
TextDrawShowForPlayer(playerid,PRUEF);
SetTimerEx("Pruefung", 1000, false, "i", playerid);
countdown1 --;
}
else if(countdown1 == 0 && countdown2 == 2)//wenn die erste Minute um ist, muss manuell der Wert 2:00min
//angezeigt werden, da eine Variable in samp nicht den Wert
//null annehmen kann
{
countdown2 --;//Minuten eins zurückstellen
countdown1 = 60;//Sekunden wieder hoch auf 60
new pruefstring[128];
format(pruefstring,sizeof(pruefstring),"Verbleibende~n~Zeit:~n~~b~2:00");//Kurze manuelle Ausgabe
TextDrawSetString(PRUEF,pruefstring);
MyTextDraw4(playerid);
TextDrawShowForPlayer(playerid,PRUEF);
SetTimerEx("Pruefung", 1000, false, "i", playerid);
countdown1 --;
}
else if(countdown1 == 59 && countdown2 == 1)//Selbe Funktion wie am Anfang nur jetzt eben für die 2. Minute
{
new pruefstring[128];
format(pruefstring,sizeof(pruefstring),"Verbleibende~n~Zeit:~n~~y~%d:d",countdown2,countdown1);
TextDrawSetString(PRUEF,pruefstring);
MyTextDraw4(playerid);
TextDrawShowForPlayer(playerid,PRUEF);
SetTimerEx("Pruefung", 1000, false, "i", playerid);
countdown1 --;
}
else if(countdown1 == 0 && countdown2 == 1)//wieder manuelle Ausgabe des Wertes 1:00
{
countdown2 --;
countdown1 = 60;
new pruefstring[128];
format(pruefstring,sizeof(pruefstring),"Verbleibende~n~Zeit:~n~~y~1:00");
TextDrawSetString(PRUEF,pruefstring);
MyTextDraw4(playerid);
TextDrawShowForPlayer(playerid,PRUEF);
SetTimerEx("Pruefung", 1000, false, "i", playerid);
countdown1 --;
}
else if(countdown1 == 0 && countdown2 == 1)
{
countdown2 --;
countdown1 = 59;
new pruefstring[128];
format(pruefstring,sizeof(pruefstring),"Verbleibende~n~Zeit:~n~~r~%d:d",countdown2,countdown1);
TextDrawSetString(PRUEF,pruefstring);
MyTextDraw4(playerid);
TextDrawShowForPlayer(playerid,PRUEF);
SetTimerEx("Pruefung", 1000, false, "i", playerid);
countdown1 --;
}
else if(countdown1 >> 1 && countdown2 >> 1)//sollte der Countdown durch sein bevor entsprechende Variable
//true ist(also die Fahrprüfung noch nicht beendet wurde)
//werden die Bedingungen für eine nicht bestandene Fahrprüfung ausgeführt
{
new Spielerdatei[64];
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
if(Auto[playerid] == 1)// wenn der Spieler sich in der Fahrprüfung für den Auto-Führerschein befindet(habe
//auch noch das selbe für Motorrad & LKW)
{
new Float:vHealth;
new Float:vSchaden;
new string[126];
GetVehicleHealth(GetPlayerVehicleID(playerid),vHealth);
vSchaden = 1000 - vHealth;
GameTextForPlayer(playerid,"~r~Durchgefallen~n~~y~Zeitlimit ueberschritten...",5000,3);
SendClientMessage(playerid,GELB,"*'___})Fahrschule({___'*");
SendClientMessage(playerid,ROT,"TUT UNS LEID");
SendClientMessage(playerid,ROT,"Du hast die Fahrprüfung leider nicht bestanden!");
//Fahrzeug Schaden
format(string,sizeof(string),"Fahrzeugschaden: %.1f/1000.0",vSchaden);
SendClientMessage(playerid,GRAU,string);
SendClientMessage(playerid,ROT2,"Geh zurück in die Fahrschule & melde dich für die nächste Prüfung an...");
dini_BoolSet(Spielerdatei,"Bfailed",true);
FS1[playerid] = 0;//Checkpoint werden 'resettet'
Auto[playerid] = 0;//Fahrprüfungsvariable = 0(nicht in der Prüfung)
DisablePlayerCheckpoint(playerid);
SetTimer("Fahrschule",15,false);//Fahrzeug respawnen
new vehicle;
vehicle = GetPlayerVehicleID(playerid);
SetVehicleToRespawn(vehicle);
TextDrawHideForPlayer(playerid,PRUEF);
}
if(LKW[playerid] == 1)
{
new Float:vHealth;
new Float:vSchaden;
new string[126];
GetVehicleHealth(GetPlayerVehicleID(playerid),vHealth);
vSchaden = 1000 - vHealth;
GameTextForPlayer(playerid,"~r~Durchgefallen~n~~y~Zeitlimit ueberschritten...",5000,3);
SendClientMessage(playerid,GELB,"*'___})Fahrschule({___'*");
SendClientMessage(playerid,ROT,"TUT UNS LEID");
SendClientMessage(playerid,ROT,"Du hast die Fahrprüfung leider nicht bestanden!");
//Fahrzeug Schaden
format(string,sizeof(string),"Fahrzeugschaden: %.1f/1000.0",vSchaden);
SendClientMessage(playerid,GRAU,string);
SendClientMessage(playerid,ROT2,"Geh zurück in die Fahrschule & melde dich für die nächste Prüfung an...");
dini_BoolSet(Spielerdatei,"CDfailed",true);
FS2[playerid] = 0;
LKW[playerid] = 0;
DisablePlayerCheckpoint(playerid);
SetTimer("Fahrschule",15,false);
//Fahrzeug respawnen
new vehicle;
vehicle = GetPlayerVehicleID(playerid);
SetVehicleToRespawn(vehicle);
TextDrawHideForPlayer(playerid,PRUEF);
}
if(Motorrad[playerid] == 1)
{
new Float:vHealth;
new Float:vSchaden;
new string[126];
GetVehicleHealth(GetPlayerVehicleID(playerid),vHealth);
vSchaden = 1000 - vHealth;
GameTextForPlayer(playerid,"~r~Durchgefallen~n~~y~Zeitlimit ueberschritten...",5000,3);
SendClientMessage(playerid,GELB,"*'___})Fahrschule({___'*");
SendClientMessage(playerid,ROT,"TUT UNS LEID");
SendClientMessage(playerid,ROT,"Du hast die Fahrprüfung leider nicht bestanden!");
//Fahrzeug Schaden
format(string,sizeof(string),"Fahrzeugschaden: %.1f/1000.0",vSchaden);
SendClientMessage(playerid,GRAU,string);
SendClientMessage(playerid,ROT2,"Geh zurück in die Fahrschule & melde dich für die nächste Prüfung an...");
dini_BoolSet(Spielerdatei,"Afailed",true);
FS3[playerid] = 0;
Motorrad[playerid] = 0;
DisablePlayerCheckpoint(playerid);
SetTimer("Fahrschule",15,false);
//Fahrzeug respawnen
new vehicle;
vehicle = GetPlayerVehicleID(playerid);
SetVehicleToRespawn(vehicle);
TextDrawHideForPlayer(playerid,PRUEF);
}
}
return 1;
}
So viel zum Countdown...
2. Der TextDraw
MyTextDraw4(playerid)
{
new pruefstring[128];
PRUEF = TextDrawCreate(10.0,275.0,pruefstring);
TextDrawColor(PRUEF,GRÜN);
TextDrawSetOutline(PRUEF,1);
TextDrawSetShadow(PRUEF,0);
TextDrawFont(PRUEF,1);
TextDrawLetterSize(PRUEF,0.6,1.2);
TextDrawShowForPlayer(playerid,PRUEF);
}
3. Die Checkpoints & Bedingungen für den Erhalt des Führerscheins
new FS1[MAX_PLAYERS];//Auto
new Auto[MAX_PLAYERS];
new FSauto[8];//verfügbare Fahrschulautos
new FSCPa[19];//Checkpoints
Nach Auswahl der Prüfung für den Auto-Führerschein durch einen DIALOG werden folgende Variablen gesetzt:
(Zeig euch jetz nicht den ganzen Code, zu verwirrend & tut auch nix zur sache
FSCPa[0] = SetPlayerCheckpoint(playerid,-2055.2590,-126.5977,35.3067,3.0);
FS1[playerid] = 1;
Auto[playerid] = 1;
public OnPlayerEnterCheckpoint(playerid)
{
//////SPIELERDATEI
new Spielerdatei[64];
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
//-> Fahrschule
//AUTO
new vehicleid;
vehicleid = GetPlayerVehicleID(playerid);
if(Auto[playerid]==1)//wenn der Spieler sich in der Prüfung befindet
{
if(IsPlayerInVehicle(playerid, vehicleid))//ist er in einem Fahrzeug(Wenn nicht wird die unten angegeben
// Nachricht ausgegeben)
{
if(vehicleid >= FSauto[0] && vehicleid <= FSauto[7])//ist er in einem Fahrschulauto
{
if(IsPlayerInCheckpoint(playerid)==FSCPa[0])//ist er im ersten Checkpoint
{
GameTextForPlayer(playerid,"~g~START~n~~r~Schaden am Wagen gibt Abzug~n~~y~3 Minuten Zeit",3000,3);
FS1[playerid] = 2;//Checkpointvariable eins hoch
Pruefung(playerid);//Countdown starten
//In "OnPlayerLeaveCheckpoint(playerid)" wird der nächste CP erstellt
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[1])
{
GameTextForPlayer(playerid,"~r~Checkpoint (1/18)",1000,3);
FS1[playerid] = 3;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[2])
{
GameTextForPlayer(playerid,"~g~Slalom (2/18)",2000,3);
FS1[playerid] = 4;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[3])
{
GameTextForPlayer(playerid,"~g~Rueckwaerts Einparken (3/18)",2000,3);
FS1[playerid] = 5;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[4])
{
GameTextForPlayer(playerid,"~g~Vorwaerts Einparken (4/18)",2000,3);
FS1[playerid] = 6;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[5])
{
GameTextForPlayer(playerid,"~r~Checkpoint (5/18)",1000,3);
FS1[playerid] = 7;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[6])
{
GameTextForPlayer(playerid,"~g~Seitlich Einparken (6/18)",2000,3);
FS1[playerid] = 8;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[7])
{
GameTextForPlayer(playerid,"~r~Checkpoint (7/18)",1000,3);
FS1[playerid] = 9;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[8])
{
GameTextForPlayer(playerid,"~r~Checkpoint (8/18)",1000,3);
FS1[playerid] = 10;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[9])
{
GameTextForPlayer(playerid,"~g~Vollbremsung im naechsten Checkpoint (9/18)",3000,3);
FS1[playerid] = 11;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[10])
{
GameTextForPlayer(playerid,"~y~BREMSEN (10/18)",1000,3);
FS1[playerid] = 12;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[11])
{
GameTextForPlayer(playerid,"~r~Checkpoint (11/18)",1000,3);
FS1[playerid] = 13;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[12])
{
GameTextForPlayer(playerid,"~r~Wenden in einem Zug (12/18)",2000,3);
FS1[playerid] = 14;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[13])
{
GameTextForPlayer(playerid,"~g~Runkurs (13/18)~n~~r~Vorne LINKS",3000,3);
FS1[playerid] = 15;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[14])
{
GameTextForPlayer(playerid,"~r~<--~n~Checkpoint (14/18)",1000,3);
FS1[playerid] = 16;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[15])
{
GameTextForPlayer(playerid,"~r~<--~n~Checkpoint (15/18)",1000,3);
FS1[playerid] = 17;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[16])
{
GameTextForPlayer(playerid,"~r~<--~n~Checkpoint (16/18)",1000,3);
FS1[playerid] = 18;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[17])
{
GameTextForPlayer(playerid,"~r~<--~n~Checkpoint (17/18)",1000,3);
FS1[playerid] = 19;
}
if(IsPlayerInCheckpoint(playerid)==FSCPa[18])//Ist der Spieler im Ziel(natürlich nur wenn der
// Countdown vorher nicht abläuft)
{
FS1[playerid] = 20;
new Float:vHealth;
new Float:vSchaden;
new string[126];
GetVehicleHealth(GetPlayerVehicleID(playerid),vHealth);
vSchaden = 1000 - vHealth;
if(vHealth >= 900)//Fahrzeug-Schaden im Rahmen?
{
GameTextForPlayer(playerid,"~g~Bestanden",5000,3);
SendClientMessage(playerid,GELB,"*'___})Fahrschule({___'*");
SendClientMessage(playerid,GRÜN,"*** GLÜCKWUNSCH ****");
SendClientMessage(playerid,GRÜN,"Du hast die Fahrprüfung erfolgreich bestanden!");
//Fahrzeug Schaden
format(string,sizeof(string),"Fahrzeugschaden: %.1f/1000.0",vSchaden);
SendClientMessage(playerid,GRAU,string);
dini_BoolSet(Spielerdatei,"FüB",true);//bekommt den Fürherschein
dini_BoolSet(Spielerdatei,"FSauto",false);
FS1[playerid] = 0;//Variablen wieder auf 0
Auto[playerid] = 0;
DisablePlayerCheckpoint(playerid);
SetTimer("Fahrschule",15,false);
countdown = 0;
//Fahrzeug respawnen
new vehicle;
vehicle = GetPlayerVehicleID(playerid);
SetVehicleToRespawn(vehicle);
TextDrawHideForPlayer(playerid,PRUEF);
return 1;
}
if(vHealth <= 899)//Fahrzeug-Schaden nicht im Rahmen
{
GameTextForPlayer(playerid,"~r~Durchgefallen",5000,3);
SendClientMessage(playerid,GELB,"*'___})Fahrschule({___'*");
SendClientMessage(playerid,ROT,"TUT UNS LEID");
SendClientMessage(playerid,ROT,"Du hast die Fahrprüfung leider nicht bestanden!");
//Fahrzeug Schaden
format(string,sizeof(string),"Fahrzeugschaden: %.1f/1000.0",vSchaden);
SendClientMessage(playerid,GRAU,string);
SendClientMessage(playerid,ROT2,"Geh zurück in die Fahrschule & melde dich für die nächste Prüfung an...");
dini_BoolSet(Spielerdatei,"Bfailed",true);//Einmal durchgefallen wird vermerkt
//(da nun niedrigere Gebühren beim nächsten Versuch)
dini_BoolSet(Spielerdatei,"FSauto",false);
FS1[playerid] = 0;
Auto[playerid] = 0;
DisablePlayerCheckpoint(playerid);
SetTimer("Fahrschule",15,false);
countdown = 0;
//Fahrzeug respawnen
new vehicle;
vehicle = GetPlayerVehicleID(playerid);
SetVehicleToRespawn(vehicle);
TextDrawHideForPlayer(playerid,PRUEF);
return 1;
}
}
}
}
else
{
SendClientMessage(playerid,GELB,"*'___})Fahrschule({___'*");
SendClientMessage(playerid,ROT2,"Steig in ein Fahrschul-AUTO um die Prüfung zu machen...");
//Besagte Nachricht wenn der Spieler ohne Fahrzeug in den CP geht
}
}
public OnPlayerLeaveCheckpoint(playerid)
{
//AUTO
new vehicleid;
vehicleid = GetPlayerVehicleID(playerid);
if(Auto[playerid]==1)
{
if(IsPlayerInVehicle(playerid, vehicleid))
{
if(vehicleid >= FSauto[0] && vehicleid <= FSauto[7])
{
if(FS1[playerid]==2)//Ist Spieler im ersten Checkpoint & verlässt ihn
{
FSCPa[1] = SetPlayerCheckpoint(playerid,-2090.0313,-142.8927,35.3203,3.0);//p1
}
if(FS1[playerid]==3)
{
FSCPa[2] = SetPlayerCheckpoint(playerid,-2085.2576,-164.2339,35.3203,3.0);//p2(slalom)
}
if(FS1[playerid]==4)
{
FSCPa[3] = SetPlayerCheckpoint(playerid,-2084.8738,-259.3287,35.3203,3.0);//p3(parken)
}
if(FS1[playerid]==5)
{
FSCPa[4] = SetPlayerCheckpoint(playerid,-2088.5686,-278.3327,35.3203,3.0);//p4
}
if(FS1[playerid]==6)
{
FSCPa[5] = SetPlayerCheckpoint(playerid,-2079.7358,-278.3954,35.3203,3.0);//p5
}
if(FS1[playerid]==7)
{
FSCPa[6] = SetPlayerCheckpoint(playerid,-2066.9626,-262.5959,35.3274,3.0);//p6
}
if(FS1[playerid]==8)
{
FSCPa[7] = SetPlayerCheckpoint(playerid,-2052.7097,-278.0153,35.3274,2.0);//p7
}
if(FS1[playerid]==9)
{
FSCPa[8] = SetPlayerCheckpoint(playerid,-2025.1770,-270.6463,35.327,3.0);//p8
}
if(FS1[playerid]==10)
{
FSCPa[9] = SetPlayerCheckpoint(playerid,-2057.9827,-245.1774,35.3203,3.0);//p9
}
if(FS1[playerid]==11)
{
FSCPa[10] = SetPlayerCheckpoint(playerid,-2057.7407,-165.9292,35.3203,3.0);//p10
}
if(FS1[playerid]==12)
{
FSCPa[11] = SetPlayerCheckpoint(playerid,-2044.2831,-172.5241,35.3274,3.0);//p11
}
if(FS1[playerid]==13)
{
FSCPa[12] = SetPlayerCheckpoint(playerid,-2045.1210,-221.3237,35.3274,3.0);//p12
}
if(FS1[playerid]==14)
{
FSCPa[13] = SetPlayerCheckpoint(playerid,-2034.0541,-209.9391,35.3203,3.0);//p13
}
if(FS1[playerid]==15)
{
FSCPa[14] = SetPlayerCheckpoint(playerid,-2038.9460,-153.4344,35.3203,3.0);//p15
}
if(FS1[playerid]==16)
{
FSCPa[15] = SetPlayerCheckpoint(playerid,-2038.9485,-215.7825,35.3203,3.0);//p14
}
if(FS1[playerid]==17)
{
FSCPa[16] = SetPlayerCheckpoint(playerid,-2038.9460,-153.4344,35.3203,3.0);//p15(wiederholen)
}
if(FS1[playerid]==18)
{
FSCPa[17] = SetPlayerCheckpoint(playerid,-2038.9485,-215.7825,35.3203,3.0);//p14(wiederholen)
}
if(FS1[playerid]==19)
{
FSCPa[18] = SetPlayerCheckpoint(playerid,-2044.5792,-126.9101,35.2586,3.0);//p16
}
}
}
}
/edit
Hab herausgefunden, dass der Countdown nicht mit den GameText-Anweisungen zusammen hängt.
Hab die GameTexte mal als TextDraws erstellt ohne bestimmte Anzeigedauer & es gab immer noch das selbe Problem,
der Countdown wird immer schneller mit jedem Checkpoint den ich durchfahre!
Daraus schließe ich, dass es mit den Checkpoints zusammenhängen muss.
Was könnte der Fehler sein?
Gruß