Überleg doch mal
Wenn das Fahrzeug beschädigt wird UND der Zustand des Fahrzeuges ÜBER 250 liegen sollte, dann löst sich die Funktion aus =)
Natürlich muss das andersrum sein.
Beiträge von FACE
-
-
Warum fangt ihr nicht erstmal an, alles mit Variablen zwischenzuspeichern und das File-System nachträglich einzufügen. (Das funktioniert dann auch reibungslos )
Ich persönlich schreibe anfänglich immer sämtliche Arrays, strings, etc.
Dies sieht der Spieler nicht, aber macht mir die Arbeit deutlich leichter.Textdraws, Dialoge etc. folgen erst später bei mir.
-
Fang erstmal an, dir ein paar Standart gamemodes anzuschauen. Dann fängst du mit kleinen Schritten an, diese abzuändern. Baust ein paar Fahrzeuge ein, schreibst ein paar Abfragen, etc...
-
public praxisa(playerid)
{
schulung[playerid]=1;//Direkt auf 1 setzen. Sonst "könnte" es Komplikationen geben!
SetPlayerPos(playerid,-2029.79,-120.518,35.1692);
Fahrschulauto = CreateVehicle(405,-2082.92,-124.124,35.3203,175.277, 0, 1,-1);
SetPlayerCheckpoint(playerid,FahrschulCheckpoints[0][0],FahrschulCheckpoints[0][1],FahrschulCheckpoints[0][2],3.0);//Der erste CP wird gesetzt.
SendClientMessage(playerid, GELB, "[Fahrschuhle]Fahr Prüfung Gestartet.");
SendClientMessage(playerid, GELB, "[Fahrschuhle]Auf Zum ersten Checkpoin.");
}
if(schulung[playerid]>0)//Wenn sich der Spieler in der Prüfung befindet.
{
DisablePlayerCheckpoint(playerid);
if((schulung[playerid]-1)<sizeof(FahrschulCheckpoints))
{
schulung[playerid]++;
SetPlayerCheckpoint(playerid,FahrschulCheckpoints[schulung[playerid]-1][0],FahrschulCheckpoints[schulung[playerid]-1][1],FahrschulCheckpoints[schulung[playerid]-1][2],3.0);
SendClientMessage(playerid, GELB, "[Fahrschuhle]Sie haben den Checkpoint Erreicht.");
SendClientMessage(playerid, GELB, "[Fahrschuhle]Ab zum Nächsten.");
}
else //Wenn letzter Checkpoint
{
DestroyVehicle(Fahrschulauto);
SendClientMessage(playerid, ROT, "------------------Erfogreich Bestanden----------------------");
SendClientMessage(playerid, GELB, "[Fahrschuhle]Sie haben ihr Führerschein erfolgreich Bestanden.");
//SetPlayerCheckpoint(playerid, -2091.8999023438, -129, 34.400001525879, 2.0);//Keine Ahnung wofür du das brauchst, aber ich lasse es mal drin.
sInfo[playerid][sSpieler_autoschein] = 1;
schulung[playerid] = 0;//Prüfung beendet.
}
}Du hast einen Kopierfehler gehabt.
-
@ Metin2:
Du hast einen kleinen Zeichen-Dreher drin.
Es müsste heißen
if(health<250) -
Das ist ein ziemlicher Zeilenaufwand.
Wir hauen zunächst erstmal alle Checkpoints in ein Array und lassen jedesmal einfach die Variable hochzählen.Sieht dann wie folgt aus:
//Definition des Spielerzählers
schulung[MAX_PLAYERS]; //Hast du zwar bereits drin, möchte ich aber anders verwenden. Musst du folglich NICHT mehr einbauen ;)
//Definition für das Array:
new Float:FahrschulCheckpoints[19][3] = {
{-2083.3999023438, -129.19999694824, 35.0},
{-2052.8999023438, -140.39999389648, 35.0},
{-2070.5, -145.7998046875, 35.0},
{-2068.5, -118.90000152588, 35.0},
{-2069.599609375, -131.19921875, 35.0},
{-2024.3000488281, -203.10000610352, 35.0},
{-2039.2998046875, -128.8994140625, 34.900001525879},
{-2025.19921875, -180.2998046875, 35.0},
{-2042.3000488281, -163.5, 35.0},
{-2042.099609375, -193, 35.0},
{-2057.3000488281, -156.5, 35.0},
{-2038.6999511719, -240.5, 35.0},
{-2083.1999511719, -245.89999389648, 36.099998474121},
{-2069.3000488281, -236.69999694824, 35.0},
{-2058.6999511719, -228.80000305176, 35.0},
{-2088.5, -204.10000610352, 35.0},
{-2067.5, -213.69999694824, 38.0},
{-2083, -157.19999694824, 35.0},
{-2083, -157.19999694824, 35.0}
//{-2091.8999023438, -129, 34.400001525879}
};Die Fahrschul-Prüfung muss durch irgendetwas ausgelöst werden. Setze dabei bitte die Variable schulung[playerid]=1; , damit die Prüfung beginnen kann. Somit erspart sich eine überflüssige, sonst notwendige, Variable.
Setze hierbei auch gleich den ersten Checkpoint zu Prüfungsbeginn: SetPlayerCheckpoint(playerid,FahrschulCheckpoints[0][0],FahrschulCheckpoints[0][1],FahrschulCheckpoints[0][2],3.0)Nun kommen wir zur Abfrage unter dem Callback "OnPlayerEnterCheckpoint":
public OnPlayerEnterCheckpoint(playerid)
{
if(schulung[playerid]>0)//Wenn sich der Spieler in der Prüfung befindet.
{
DisablePlayerCheckpoint(playerid);
if(schulung[playerid]<sizeof(FahrschulCheckpoints))
{
schulung[playerid]++;
SetPlayerCheckpoint(playerid,FahrschulCheckpoints[schulung[playerid]-1][0],FahrschulCheckpoints[schulung[playerid]-1][1],FahrschulCheckpoints[schulung[playerid]-1][2],3.0);
SendClientMessage(i, GELB, "[Fahrschuhle]Sie haben den Checkpoint Erreicht.");
SendClientMessage(i, GELB, "[Fahrschuhle]Ab zum Nächsten.");
}
else//Wenn letzter Checkpoint
{
DestroyVehicle(Fahrschulauto);
SendClientMessage(i, ROT, "------------------Erfogreich Bestanden----------------------");
SendClientMessage(i, GELB, "[Fahrschuhle]Sie haben ihr Führerschein erfolgreich Bestanden.");
//SetPlayerCheckpoint(playerid, -2091.8999023438, -129, 34.400001525879, 2.0);//Keine Ahnung wofür du das brauchst, aber ich lasse es mal drin.
sInfo[playerid][sSpieler_autoschein] = 1;
schulung[playerid] = 0;//Prüfung beendet.
}
}
return 1;
}So in etwa könnte die ganze Sache aussehen. Wäre nebenbei doch deutlich kürzer.
-
Schau mal. Wenn du in der Selection einen FeuerwehrCharakter auswählst, dann setzt er dich in das Feuerwehr-Team.
Wählst du nun einen Zivi-Charakter, so bist du immernoch im Feuerwehr-TeamLösungsmöglichkeit:
Bei allen anderen Classes wieder auf TEAM_ZIVILISTEN (5) setzen. -
Es haben ja alle überlebt
-
new RandomSpawn[MAX_PLAYERS];//das hier brauchst du nicht! wofür denn bitte diese zeile???!!
new Float:RandomSpawns[2][3] = {//Sind doch erstmal nur 2 Werte und keine 4 und in die zweite Klammer gehört hier eine 3 (ich seh da aufjedenfall x,y,z)
{-2789.2852,-271.1917,7.1875},
{-2714.6638,-232.5632,7.1871}
};//Sonst in Ordnung.
forward RandomSpawn(playerid);public RandomSpawn(playerid)
{
if(RandomSpawn{playerid] == 0)
{
new rand = random(sizeof(RandomSpawns);
SetPlayerPos(playerid, RandomSpawns[rand][0], RandomSpawns[rand][1],RandomSpawns[rand][2]);//Du hast die Z-Coordinate vergessen
}
return 1;
}Sonst sollte es passen.
-
1000 weniger 250 macht meines Wissens nach 750.
Nimmst halt Prozent davon -
klar, kein problem.
-
deswegen hab ichs ja nochmal geschrieben
-
Kopier einfach (wenn du vllt. wieder an nem rechner sein solltest ) die Quelltexte aus den Fenstern (bitte nicht doppelt)
Und ändere die Werte von 200 auf 250. (bzw 250.1) -
Kein Ding
MFG FACE.~Topic close pls~
-
Ich hatte halt den Fehler in der IsPlayerInFrak Funktion vermutet
Vermute ich nebenbei immernoch.
Außerdem sieht das hier komisch aus:
format(text,sizeof(text),"[Fraktions Chat] %s: %s",SpielerName(playerid),text);
und das :
SendClientMessage(i,Blau,text);Was bemerkt?
-
http://wiki.sa-mp.com/wiki/VehicleHealth
sorry, ab 250 abwärts brennt der karren.
also ändere einfach den Wert in 250 (evtl. 250.1)Also bitte auch bei der OnVehicleDamageStatusUpdate Geschichte die Werte ändern.
-
Die Sache von Fernandez funktioniert an für sich schon, fehlt nur ein kleiner Teil:
ocmd:f(playerid,params[])
{
new text[128];
if(sscanf(params,"s",text))return SendClientMessage(playerid,Grün,"/f [Chat-Text]");
format(text,sizeof(text),"[Fraktions Chat] %s: %s",SpielerName(playerid),text);
for(new i=0; i<GetMaxPlayers(); i++)
{
if(IsPlayerConnected(i))
{
if(GetPVarInt(playerid,"Fraktion")==GetPVarInt(i,"Fraktion"))//Der Spieler wird wohl immer in seiner eigenen Fraktion sein, also Fragen wir ab, ob er in derselben ist, wie der Sender der Nachricht.
{
SendClientMessage(i,Blau,text);
}
}
}
return 1;
}Ich weiß halt nicht, wie eure IsPlayerInFraktion - Abfrage definiert ist.
So könnte es klappen, muss aber nicht.
EDIT: Ähm wir senden zweimal den TEXT ?!?
Schaut euch nochmal die oberen Zeilen an, dann findet ihr auch den Fehler.http://wiki.sa-mp.com/wiki/OnPlayerPrivmsg
Wiki hilft weiter(also der code stimmt jetzt wahrscheinlich von mir nicht wirklich, wie bereits im vorfeld schon erwähnt.)
-
Das muss man natürlich schon ein wenig umstruktieren
if(strcmp(cmd, "/motor",true) == 0)
{
if((GetPlayerVehicleID(playerid)!=INVALID_VEHICLE_ID) && (GetPlayerState(playerid)==PLAYER_STATE_DRIVER))//Erstmal abchecken, ob er überhaupt in einem Fahrzeug sitzt "UND" Fahrer ist!
{
if(IsANoTachoVehicle(GetPlayerVehicleID(playerid)))
{
SendClientMessage(playerid, COLOR_GRAD1, "{FFFFFF}Fahrräder haben {FF0000}keinen{FFFFFF} Motor ...");
return 1;
}
new engine,lights,alarm,doors,bonnet,boot,objective;
new vid = GetPlayerVehicleID(playerid);
GetVehicleParamsEx(vid,engine,lights,alarm,doors,bonnet,boot,objective);
if(engine == VEHICLE_PARAMS_ON)
{
SetVehicleParamsEx(vid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~W~Motor ~r~aus!", 2000, 5);
Motor[vid] = false;//Keine Ahnung wo man das noch weitergehend verwenden müsste; finde ich persönlich jetzt unnötig ;)
TextDrawSetString(tMotor[playerid], "[~r~Motor~w~]");
}
else
{
new Float:health;
GetVehicleHealth(vid,health);
if(health<400)
{
return SendClientMessage(playerid,0xFFAAFF,"Sorry Kolläsch, aber dein Motor machts nichtmehr");
}
else
{
SetVehicleParamsEx(vid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~W~Motor ~g~an!", 2000, 5);
Motor[vid] = true;//Hier ebenfalls =)
TextDrawSetString(tMotor[playerid], "[~g~Motor~w~]");
}
}
}
return 1;
}In etwa so sollte das klappen
Edit:Habe die Fahrer-Abfrage direkt mit oben rein gehauen.
-
Achso...
hau das einfach in die obige Funktion mit reinHier:
public OnVehicleDamageStatusUpdate(vehicleid, playerid)
{
//#pragma unused playeridnew Float:health;
GetVehicleHealth(vehicleid, health);
if(health<200)
{
for(new i=0;i<GetMaxPlayers();i++)
{
if(IsPlayerInVehicle(i,vehicleid))
{
SetVehicleHealth(vehicleid,200.0);//Hier einfach einsetzen :D
RemovePlayerFromVehicle(i);
}
}
}
return 1;
} -
nee du, brauchst du nicht. Hab Spaß dran
MFG FACE.~ Topic close pls~