Hallo,
hier in diesem Tutorial erkläre ich euch wie ihr ein Dynamisches Car System erstellt.
Benötigt wird:
-Dini
-Fortgeschrittenes PAWN wissen
Include einbinden:
#include <dini>
Ganz oben unter #include <a_samp>
Enum Struktur:
enum Car_System
{
aID,
aModel,
Float:aX,
Float:aY,
Float:aZ,
Float:aAngle,
}
new CarInfo[MAX_VEHICLES][Car_System];
Hier haben wir nun eine Enum Struktur erstellt, diese enthält:
-Die Model ID & die Car ID & die Floats X,Y,Z u. Angle
für was brauchen wir das?
Das wird gebraucht um das Car beim Laden an diesen Punkten zu erstellen, wenn wir jetzt aber keine Model haben wir irgendwo ein Auto gespawnt sprich ihr habt 2 Cars
das eine ist ein Infernus das andere ein Sultan. Der Sultan ist in LS, das andere Fahrzeug hingegen in LV. Wir starten das Script neu und schwups werden die Cars an diesen Orten gespawnt aber sie haben nicht die gewünschte Model ID.
die Car ID hingegen ist dazu da für ein Abfrage ob man Besitzer ist ( Ist hier im Tutorial nicht enthalten!) dazu wird die Car ID abfragt wer denn der Besitzer ist.
CarInfo ist dazu da, das jedes Vehicle diese Enum Struktur bekommt.
Speichern & Laden:
forward SpeicherFahrzeug(carid);
forward LadeFahrzeug(carid);
wie die Include oben im Script einbringen
public SpeicherFahrzeug(carid)
{
if(carid <= 0)
{
return 1;
}
CarInfo[carid][aModel] = GetVehicleModel(carid);
new str[25];
format(str, sizeof(str), "%d.car", carid);
dini_Create(str);
{
dini_IntSet(str,"ID",CarInfo[carid][aID]);
dini_FloatSet(str,"aX", CarInfo[carid][aX]);
dini_FloatSet(str,"aY", CarInfo[carid][aY]);
dini_FloatSet(str,"aZ", CarInfo[carid][aZ]);
dini_FloatSet(str,"aAngle", CarInfo[carid][aAngle]);
dini_IntSet(str,"Model",CarInfo[carid][aModel]);
}
return 1;
}
Ganz unten im Script einfügen
hier bekommt jedes Car eine eigene Datei zugewiesen die im CMD (Weiter unten) die von der Car ID bestimmt wird ausgenommen die Car ID: 0
sprich Fahrzeug Nummer 1 hat die Datei Nummer 1.car
dini_IntSet speichert ein Integer z.B. Model ist ein Integer
dini_FloatSet speichert einen Float wert
dini_Create erstellt eine Datei
(Ich verweise hiermit auf ein Dini Tutorial : [ SCRIPTING ] Dateiensystem dini - Dateien erstellen, löschen, speichern, laden)
public LadeFahrzeug(carid)
{
new str[25];
format(str, sizeof(str), "%d.car", carid);
if(carid == 0)
{
return 1;
}
if(fexist(str))
{
CarInfo[carid][aID] = dini_Int(str, "ID");
CarInfo[carid][aX] = dini_Float(str, "aX");
CarInfo[carid][aY] = dini_Float(str, "aY");
CarInfo[carid][aZ] = dini_Float(str, "aZ");
CarInfo[carid][aAngle] = dini_Float(str, "aAngle");
CarInfo[carid][aModel] = dini_Int(str, "Model");
}
return 1;
}
Ganz unten im Script einfügen
dini_Int lädt eine Integer
dini_Float lädt einen Float Wert herraus
hierbei wird mit if(fexist(str)) überprüft ob die Datei existiert wenn nicht dann passiert nicht.
for(new i = 1; i < MAX_VEHICLES; i++)
{
new string[32];
format(string, sizeof(string), "%d.car", i);
if(fexist(string))
{
LadeFahrzeug(i);
CreateVehicle(CarInfo[i][aModel], CarInfo[i][aX], CarInfo[i][aY], CarInfo[i][aZ], CarInfo[i][aAngle],0, 0, -1);
}
}
dies kommt unter OnGameModeInit() rein.
hierbei wird eine ForSchleife durch gelaufen die MAX_VEHICLES entspricht (ich glaube das ist 2000) bei jeder Datei wo existiert, wird ein Fahrzeug mit der Model ID aus der Datei erstellt und genau an den X,Y,Z u. Angle Kordinaten gespawnt.
CMD:
new cmd[256], idx; //Strtok
cmd = strtok(cmdtext, idx); // Strtok
if(strcmp(cmd, "/veh", true) == 0)
{
new tmp[256];
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_RED, "BENUTZUNG: /veh [modelid(400-611)]");
return 1;
}
new carid, Float:x, Float:y, Float:z, Float:angle, pname[MAX_PLAYER_NAME];
GetPlayerPos(playerid, x,y,z);
GetPlayerFacingAngle(playerid, angle);
carid = strval(tmp);
if(GueltigesFahrzeug(carid))
{
GetPlayerName(playerid,pname,sizeof(pname));
new id = CreateVehicle(carid, x+2,y,z,angle+4,0,0,-1);
CarInfo[id][aID] = id;
CarInfo[id][aX] = x;
CarInfo[id][aY] = y;
CarInfo[id][aZ] = z;
CarInfo[id][aAngle] = angle;
CarInfo[id][aModel] = carid;
SpeicherFahrzeug(id);
SendClientMessage(playerid, COLOR_RED, "Car gespawnt!");
}
else
{
SendClientMessage(playerid, COLOR_RED, "IDs von 400 bis 611 sind nur erlaubt!");
}
return 1;
}
ich denke dies klärt sich von selbst, wenn man alles vorher durch gelesen hat das einzigste wäre, das hier die Enum Struktur die Werte zugewiesen bekommt z.B. /veh 451
das Fahrzeug hat damit die Model ID 451.
forward GueltigesFahrzeug(carid);
bei wie bei den anderen Forward erfolgt die einfügung!
public GueltigesFahrzeug(carid)
{
if(carid >= 400 && carid <= 611)
{
return 1;
}
return 0;
}
ganz Unten im Script wie die anderen Publics
hier bei wird die eingabe abgefragt ob sie in dem Rahmen der Model IDs ist
strtok(const string[], &index)
{
new length = strlen(string);
while ((index < length) && (string[index] <= ' '))
{
index++;
}
new offset = index;
new result[20];
while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
{
result[index - offset] = string[index];
index++;
}
result[index - offset] = EOS;
return result;
}
Hier erfolgt keine Erklärung wenn benötigt im SAMP Wikipedia nachsehen
Ich hoffe euch hat das Tutorial gefallen
-MfG: Apoolecu