Hallo,
ursprünglich habe ich ja ein Tanksystem geschrieben, bei dem allerdings anscheinend ein paar Fehler drin waren. Dann würde ich hiermit ein neues schreiben und es gleich noch um ein Motorensystem erweiten.
Gliederung:
- Was erkläre ich?
- Motorystem (Motor an/aus mit Command)
- Tank verringern
- Command zum Tanken
- TextDraw zur Anzeige erstellen
1. Was erkläre ich?
Ich versuche euch hiermit beizubringen, wie ihr ein simples funktionierendes Motor- und Tanksystem schreiben könnt.Das ganze wird wie folgt ablaufen: Alle Fahrzeuge spawnen mit ausgeschaltetem Motor und 100 Liter Tank (abgesehen von Fahrrädern). Man steigt ein und startet ihn mit /m. Solang der Motor läuft (also solang man ihn nicht mit erneuter Eingabe von /m ausgeschaltet hat), verbraucht das Auto alle 10 Sekunden 1 Liter Benzin.Wenn der Tank leer ist, kann man ihn mit /tanken wieder für einen gewissen Betrag auffüllen (Preis änderbar).
- Jedes Fahrzeug hat genau 100 Liter Benzin (abgesehen von Fahrrädern)
- Der Tank sinkt bei jedem Fahrzeug gleich schnell
- /tanken ist überall nutzbar. Wer dies nur an Tankstellen haben will, soll noch mit IsPlayerInRangeOfPoint arbeiten.
- Das Motorsystem ist ohne das Tanksystem nutzbar, jedoch NICHT andersrum (Tanksystem nicht alleine nutzbar.
- Für das gesamte Tutorial wird Grundwissen erwartet.
2. Motorsystem
Dann fangen wir mal mit dem Tutorial an. Zuerst müssen wir uns einen Boolean erstellen, ob der Motor der Fahrzeuge eingeschaltet ist. Außerdem brauchen wir noch Variablen für die VehicleParams (Motorsystem aus SAMP 0.3c). Also setzen wir an den Anfang des Scripts folgenden Code:
new engine,lights,alarm,doors,bonnet,boot,objective; // Dies sind die Variablen die für das einschalten des Motors benötigt werden.
new bool:Motor[MAX_VEHICLES]=false; // Dies ist die Boolean für den Motor. [MAX_VEHICLES] ist angehängt, da sie für jedes Fahrzeug unterschiedlich sein kann.
Nun muss nach dem Spawn der verschiedenen Fahrzeuge auch noch ihr Motor ausgeschaltet werden. Also erstellen wir im Callback OnGameModeInit eine Schleife:
ManualVehicleEngineAndLights(); // Dies muss in OnGameModeInit angegeben werden, damit das ganze System überhaupt funktioniert.
for (new i=0; i< MAX_VEHICLES; i++)
{
GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
Motor[i] = false;
}
public OnVehicleSpawn(vehicleid)
{
GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective);
SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
Motor[vehicleid] = false;
return 1;
}
Dabei wird durch die Schleife die Variable i erstellt, die den Wert 0 trägt und kleiner als die Anzahl aller Fahrzeuge ist (= MAX_VEHICLES) und sich bei jedem Durchlauf der Schleife um 1 erhöht.
GetVehicleParamsEx speichert die Parameter des Fahrzeuges, das gerade in der Schleife durchlaufen wird.
SetVehicleParamsEx schaltet dann den Motor aus, und lässt die restlichen Parameter so wie sie vorher waren.
Die letzte Zeile der Schleife setzt den Boolean Motor (den wir oben definiert haben) für dieses Fahrzeug auf falsch.
Danach wird noch in dem Callback OnVehicleSpawn der Motor ausgeschaltet, damit Fahrzeuge die zerstört wurden und danach respawnen auch einen ausgeschalteten Motor haben.
Nun müssen wir allerdings noch den Command zum Starten/Ausschalten des Motors erstellen. Das geht wie folgt im Callback OnPlayerCommandText:
if(strcmp(cmdtext, "/m", true) == 0)
{
if(GetPlayerVehicleSeat(playerid) == 0) // Überprüft zuerst ob der Spieler der Fahrer eines Fahrzeugs ist.
{
new car = GetPlayerVehicleID(playerid); // Erstellt die Variable car, die die FahrzeugID des Spielers trägt.
if(GetVehicleModel(car) == 509 || GetVehicleModel(car) == 481 || GetVehicleModel(car) == 510) // Wenn das Fahrzeug ein Fahrrad ist,
{ // dann sende dem Spieler die Nachricht, sodass er es auch weiß.
SendClientMessage(playerid, COLOR_RED, "Du sitzt auf einem Fahrrad. Das hat keinen Motor!");
}
else if (Motor[car] == false) // Ansonsten, wenn der Motor des Fahrzeugs ausgeschaltet ist (haben wir ja oben mit dem bool Motor definiert)
{
GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective); // Selbe Prozedur wie oben
SetVehicleParamsEx(car,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // Selbe Prozedur wie oben, nur dass der Motor nun eingeschaltet wird.
Motor[car] = true; // Setzt den Bool Motor auf true
}
else // Ansonsten, wenn der Motor an ist
{
GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
SetVehicleParamsEx(car,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
Motor[car] = false; // Setzt den Bool wieder auf falsch zurück.
}
}
return 1;
}
Damit wäre der Command auch erstellt. Allerdings haben wir jetzt das Problem, dass bei Fahrrädern der Motor zu Anfang auch ausgeschaltet wurde und mit einer Eingabe von /m bei Fahrrädern ja nur die Nachricht kommt, dass diese keinen Motor haben.
Das können wir aber auch sehr leicht lösen, nämlich unter dem Callback OnPlayerEnterVehicle
if(GetVehicleModel(vehicleid) == 509 || GetVehicleModel(vehicleid) == 481 || GetVehicleModel(vehicleid) == 510) // Überprüft ob das Fahrzeug ein Fahrrad ist (wie im Command oben)
{
GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // Speichere den derzeitigen Status
SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // Behalte alles bei, aber starte den Motor.
}
So. Nun wären wir mit dem Motorsystem schon fertig. Wenn ihr wollt, könnt ihr nun aufhören, ansonsten aber auch gerne weitermachen und das Tanksystem auch noch in euer Script einbeziehen.
3. Tank verringern
Für das Tanksystem müssen wir auch erstmal einige Dinge am Anfang des Scriptes definieren:
#define VERLUST 10000 // Die Zeit, die der Motor braucht um 1 Liter zu verbrennen in Millisekunden (Hier 10 Sekunden)
#define BENZINPREIS 3 // Der Preis, den das Benzin pro Liter kostet (Hier 3$)
forward BenzinVerlust(); // Wir forwarden unseren Timer für den Benzinverlust
forward Auftanken(playerid); // Wir forwarden unseren Timer für das Tanken
new Tank[MAX_VEHICLES], bool:TanktGerade[MAX_VEHICLES]=false, tanktimer[MAX_PLAYERS];
Die Variable Tank steht hier für die Litermenge im Tank des einzelnen Fahrzeuges. TanktGerade ist wieder ein Boolean, der wieder für jedes Fahrzeug einzeln gilt. tanktimer wird der Timer zum Tanken für die einzelnen Spieler sein.
Da wir den Tank für jedes Fahrzeug nun erstmal auf 100 Liter setzen wollen, müssen wir in unsere Schleife aus dem Motorensystem gehen. Außerdem benötigen wir noch den Start des Timers zum Reduzieren des Tanks. Dafür muss das Callback OnGameModeInit wie folgt aussehen:
SetTimer("BenzinVerlust", VERLUST, true);
for (new i=0; i< MAX_VEHICLES; i++)
{
GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
Motor[i] = false;
Tank[i] = 100;
}
Als erstes wird der Timer um die Funktion BenzinVerlust aufzurufen gesetzt. VERLUST wurde ja oben definiert und gibt die Zeit an, in der das Fahrzeug 1 Liter verliert. Die Schleife haben wir ja so bereits erstellt, allerdings ist nun noch das Tank(i) = 100;*hinzugekommen, was den Tank für jedes Fahrzeug auf 100 setzt. (* die normalen Klammern durch eckige ersetzen. Das würde allerdings kursiven Text erzeugen, daher mit normalen geschrieben.)
Weiter geht es HIER