GTASAMultiplayer
Würden Sie gerne auf diese Nachricht reagieren? Erstellen Sie einen Account in wenigen Klicks oder loggen Sie sich ein, um fortzufahren.
GTASAMultiplayer

San Andreas Multiplayer - Deutsches Forum
 
StartseiteGalerieNeueste BilderSuchenAnmeldenLogin

 

 TankSystem

Nach unten 
AutorNachricht
Killerboy

Killerboy


Anzahl der Beiträge : 6
Punkte : 25
Bewertungssystem : 0
Anmeldedatum : 24.04.10
Alter : 26

TankSystem Empty
BeitragThema: TankSystem   TankSystem EmptySo Apr 25, 2010 10:11 pm

Ich versuche euch hier zu erklären wie ihr ein Tanksystem erstellt.
Vorab gibt es zu sagen:
- Jedes Fahrzeug hat einen gleich großen Tank
- Jedes Fahrzeug verliert gleich schnell Benzin
- Es sind noch keine Tankstellen integriert, diese müsst ihr selber einfügen.
Ich poste immer den Teil des Scripts, schreibe dann wohin er kommt und erkläre etwas dazu.


Code:
#define ORANGE 0xFFA500FF
forward Tank(playerid);
new Tankmenge[MAX_VEHICLES];
new Float:Tankstellen[MENGE][3] =
{
   {X, Y, Z},
   {X, Y, Z},
   {X, Y, Z}
};

Die erste Zeile definiert (#define) die Farbe ORANGE mit dem RGBA Code.
Danach wird ein neues Callback definiert mit dem Namen "Tank" und keinen Parametern die in ihm vorkommen (also () )
In der nächsten Zeile wird eine neue Variable mit dem Namen Tankmenge erstellt. In ihr wird der Tank für jedes Auto individuell gespeichert. Die Letzten Zeilen erstellen eine mehrdimensionale Variable mit dem Namen "Tankstellen" und einer Größe ihrer Menge (Die MENGE müsst ihr selbst festlegen, dazu zählt ihr einfach alle Koordinaten für Tankstellen die ihr habt ab und tragt sie hier ein). Danach definiert man alle Koordinaten der Tankstellen in der Tabelle. Jenachdem wie viele Tankstellen man hat muss diese natürlich erweitert werden.
Das ganze kommt nach oben ins Script, unter euren Includes.


Code:
for(new i=0;i<MAX_VEHICLES;i++)
{
   Tankmenge[i] = 100;
}

Das erstellt eine Schleife in der die Tankmenge jedes Autos beim Serverstart auf 100 gesetzt wird. Als erstes wird die Schleife gestartet, erstellt dann eine neue Variable "i" mit dem Wert 0. Dieser Wert wird solange erhöht bis MAX_VEHICLES voll ist, also jedes Auto im Script durchgangen wurde. Mit jedem Durchgang der Schleife erhöht sich der Wert von i um eins.
Dieser Teil kommt in das Callback OnGameModeInit().

Code:
SetTimer("Tank",ZEIT,1);

Hier wird ein Timer gesetzt, der den Callback "Tank" (den wir oben definiert haben) startet. Der Wert am Ende, das 1, wiederholt den Timer, sodass er durchgehend läuft. ZEIT müsst ihr selber einfüllen, es ist in diesem Falle die Zeit in Millisekunden in der der Wagen 1L Benzin verliert (1000ms=1s).
Dieser Teil muss in das Callback OnPlayerEnterVehicle(playerid, vehicleid, ispassenger).


Code:
public Tank(playerid)
{
   for(new i;i<MAX_PLAYERS;i++)
   {
      if(IsPlayerConnected(i))
      {
         if(GetPlayerState(i) == PLAYER_STATE_DRIVER)
         {
            new Wagen = GetPlayerVehicleID(i);
            if(Tankmenge[Wagen] >= 1)
            {
               Tankmenge[Wagen]--;
            }
            else
            {
               GameTextForPlayer(playerid,"Dein Tank ist leer. ~n~Gebe /exit ein um aus deinem Wagen zu kommen.",90000,4);
               TogglePlayerControllable(playerid,0);
            }
         }
      }
   }
   return 1;
}

Hiermit erstellen wir wieder eine Schleife mit der Variable i, die aber diesmal alle Spieler durchgeht, und nicht alle Fahrzeuge. Zuerst überprüft sie ob ein Spieler verbunden ist. Wenn er dies ist, prüft sie weiter ob er als Fahrer in einem Fahrzeug ist. Wenn dies zutrifft erstellt sie die Variable "Wagen" mit der ID des Fahrzeuges in dem sich der Spieler gerade befindet. Nun überprüft sie ob der Tank des Wagens größer oder gleich 1 ist und verringert es in diesem Falle um 1. Sollte die Tankmenge = 0 sein, kann der Spieler sich nichtmehr kontrollieren und erhält eine Nachricht.
Dieser Teil kommt ganz unten ins Script - Nicht in einen bereits erstehenden Callback.

Code:
if(strcmp("/tanken", cmdtext,true) ==0)
{
   if(IsPlayerInAnyVehicle(playerid))
   {
      for(new i=0;i<MENGE;i++)
      {
         if(IsPlayerInRangeOfPoint(playerid,15.0,Tankstellen[i][1],Tankstellen[i][2],Tankstellen[i][3]))
         {
            new Wagen = GetPlayerVehicleID(playerid), msg[128];
            new Full = 100-Tankmenge[Wagen];
            new Kosten = Full*PREIS;
            format(msg, sizeof msg,"Du hast %d Liter für %d$ getankt.",Full,Kosten);
            SendClientMessage(playerid,ORANGE,msg);
            Tankmenge[Wagen] = 100;
            return 1;
         }
         else
         {
            SendClientMessage(playerid,ORANGE,"Du bist nicht an der Tankstelle!");
         }
      }
   }
   else
   {
      SendClientMessage(playerid,ORANGE,"Du bist in keinem Fahrzeug!");
   }
   return 1;
}

Wir erfragen ob der Spieler den Command /tanken eingibt. Dann schaut er ob der Spieler in einem Fahrzeug ist, ansonsten gibt er die Nachricht ganz unten wieder "Du bist nicht in einem Fahrzeug!". Nun erstellt er eine neue Schleife mit der Variable "i" = 0, kleiner als MENGE (Dies ist die MENGE der Tankstellen die ihr oben festgelegt habt) und in jedem Durchgang um 1 erhöhend. Dort überprüft er erstmal ob wir in der Nähe einer oben definierten Tankstelle sind. Wenn das nicht der Fall ist bekommen wir die Nachricht "Du bist nicht an der Tankstelle!". Sollte es doch so sein, so erstellt er erstmal die Variable Wagen mit der Fahrzeug-ID des Spielers. Dann die Variable msg mit einer Größe von 128 (Dies wird unsere Tanknachricht sein). Nun rechnet er in der Variable Full aus wieviel vom Wagen getankt werden muss. Diese Literzahl speichert er und rechnet sie in der neuen Variable Kosten mal euren Preis (Literpreis! Ich würde in etwa 10-50 empfehlen). Nun formatiert er die Variable msg mit der Nachricht dass man ... Liter Benzin für ... $ getankt hat. Diese Nachricht schickt er nun in ORANGE an den Spieler und füllt den Autotank wieder auf 100.
Diese Funktion muss in das Callback OnPlayerCommandText(playerid, cmdtext[]).


Code:
if(strcmp("/exit", cmdtext,true) ==0)
{
   if(IsPlayerInAnyVehicle(playerid))
   {
      RemovePlayerFromVehicle(playerid,GetPlayerVehicleID(playerid));
      TogglePlayerControllable(playerid,1);
   }
   else
   {
      SendClientMessage(playerid,ORANGE,"Du  bist in keinem Fahrzeug!");
   }
   return 1;
}


Wenn man den Command /exit eingibt und in einem Fahrzeug ist entfernt er zuerst den Spieler aus seinem Fahrzeug und schaltet ihn dann um, sodass er sich wieder bewegen kann und kontrollierbar ist. Wenn man in keinem Fahrzeug ist bekommt man die Nachricht "Du bist in keinem Fahrzeug!". Dieser Command funktioniert immer wenn man in einem Fahrzeug ist, nicht nur wenn der Tank leer ist.
Diese Funktion muss in das Callback OnPlayerCommandText(playerid, cmdtext[]).

Das sollte eigentlich alles gewesen sein. Ich hoffe mein Tutorial hat euch geholfen und ihr habt ein bisschen was gelernt.
Wenn ihr Fragen, Anregungen oder Verbesserungsvorschläge habt, immer her damit


Von:Killerboy:)
Nach oben Nach unten
http://gtasamultiplayer.liberte.tv
 
TankSystem
Nach oben 
Seite 1 von 1

Befugnisse in diesem ForumSie können in diesem Forum nicht antworten
GTASAMultiplayer :: Tutorials-
Gehe zu: