Hallo zusammen
wir werden heute ein 3Dimensionales Array bauen
bezogen wird das ganze auf Busstrecken
Es ist eine Erweiterung von dem Tutorial von Goldkiller *klick mich*
Um diesem Tutorial zu folgen müsst ihr folgende Vorraussetzungen erfüllen
1. Erfahrung mit Enums
2. 1-3 Busstrecken die ihr Ingame schon gesaved habt
3. das OCMD Include
3. SpielerEnum und ggf eine MYSQL Verbindung da ich dies auf MYSQL schreibe bzgl des Jobsystems
ich werde dieses System direkt so umschreiben, dass es ein direktes JobSystem ist.
Solltet ihr bereits eins haben so müsst ihr nicht Alle schritte befolgen und lediglich anpassen
Nun wir teilen dieses Tutorial in 3 Schritte
1. Vorbereitungen
2. Das Grundgerüst
3. Anpassung auf das JobSystem
Die Vorbereitungen
Also zuerst werden wir nun die Enums erstellen die wir benöigen
In Diesem Fall sind es 3
1. Das SpielerEnum, welches ihr sowieso zu Anfang erstellt um die Daten aus der DB zu laden
Bei dem Spielerenum brauchen wir nun folgende Dinge
Checkpoints,
r_id,
bool:aktiv //Entweder True oder False
beim letzten wird das Komma weggelassen
Anschließend erstellen wir 2 weitere Enums
enum busroutenEnum{ //brroutes
Float:b_x,
Float:b_y,
Float:b_z,
Float:b_rad,
win
}
enum busstartsenum{ //brInfo
Float:b_x,
Float:b_y,
Float:b_z,
b_cps
}
im 1. Enum davon werden die Routen festgelegt also die Checkpoints etc. Auch habe ich mir gedacht dass wir hier den Gewinn einfügen
beim 2. Enum werden die Startcheckpoints festgelegt + die Anzahl der Checkpoints
--------------------------------------------------------------------
Nun wollen wir das ganze ja auch verwenden also erstellen wir uns news
new brInfo[][busstartsenum] = {
// X Y Z ANZAHL DER CHECKPOINTS
{2221.6140,1866.6394,10.3858, 10},
{1243.3254,-1847.2728,13.1883,7},
//{},
};
//brInfo[playerid][b_x]
//brroutes[playerid][b_x]
new brroutes[][][busroutenEnum] = {
// X Y Z Radius Gewinn,RoutenID
{ //LV nach LS
{2154.9355,1961.0078,10.2405,5.0,250},
{2178.5608,2349.9243,10.2335,5.0,250},
{2119.5234,2061.8625,10.2251,5.0,250},
{2039.7462,1005.9709,10.2359,5.0,250},
{1789.3076,801.3461,10.6779,5.0,250},
{1673.3729,-785.5421,54.4621,5.0,250},
{1186.4357,-934.5354,42.2987,5.0,250},
{958.2468,-1080.1121,24.5061,5.0,250},
{1028.4401,-1331.0526,12.9473,5.0,250},
{1151.0576,-1409.2263,13.0779,5.0,250}
},
{ //LS nach SF
{1243.3254,-1847.2728,13.1883,5.0,250},
{670.6043,-1735.1041,13.2707,5.0,250},
{278.9674,-1513.9545,32.1741,5.0,250},
{-130.4320,-1230.6105,2.5817,5.0,250},
{-1787.2384,-571.1826,16.1349,5.0,250},
{-1986.4297,151.1903,27.3380,5.0,250},
{-1950.5823,576.5387,34.8990,5.0,250},
{0.0, 0.0, 0.0, 0.0, 0},
{0.0, 0.0, 0.0, 0.0, 0},
{0.0, 0.0, 0.0, 0.0, 0}
//{}
//{}
}
};
Im Ersten ist wie oben beschrieben die Startpoints festgelegt
Wichtig dabei ist dass die Anzhal der Checkpoints hinten festgelegt wird
da wir sonst ein Problem bekommen, wenn wir weniger als 10 Chckpoints haben verwenden wir sogenannte "Platzhalter"
die sehen so aus {0.0, 0.0, 0.0, 0.0, 0}
haben wir bei einer Strecke jetzt nur 8 von 10 Points so geben wir oben beim definieren der Startpunkte nur 8 an und die leeren Checkpoints werden nicht aufgerufen!
Schritt 2, Das Grundgerüst
Nun erstellen wir einen Befehl für die Jobauswahl
ocmd:startjobs(playerid,params[])
{
ShowPlayerDialog(playerid,ANMELDUNGEN,DIALOG_STYLE_LIST,"Anmeldestellen","Busfahrer/in Los Santos \nBusfahrer Las Venturas","Anmeldung","Abbrechen");
return 1;
}
ich hab den Busfaher in LS und LV getrent
Nun werden wir dafür den Dialog oben erstellen
entweder
#define ANMELDUNEN 5213
oder ihr macht es in einem Enum wo ihr die Zahlen dann nicht braucht
enum {
ANMELDUNGEN
//WEITERES
};
Anschließend gehen wir zu
OnDialogResponse
und fügt dort die DialogID mit den Listitems ein
also so
if(dialogid == ANMELDUNGEN)
{
if(!response) return 1;
if (listitem == 0)
{
SendClientMessage(playerid,CL_HBLUE,"Du hast den Busfahrer/innen-Job gestartet -> Fahre nun zur Anmeldestelle von Bus - Los Santos GmbH!");
Roads[playerid] = 1;
SetPlayerCheckpoint(playerid,1268.6335,-1816.1614,13.1145,7.0); //Annahme Stelle
return 1;
}
if (listitem == 1)//Busfahrer LV
{
SendClientMessage(playerid,CL_HBLUE,"Du hast den Busfahrer/innen-Job gestartet -> Fahre nun zur Anmeldestelle von Bus - Las Venturas GmbH!");
Roads[playerid] = 2;
SetPlayerCheckpoint(playerid,2221.6140,1866.6394,10.3858,7.0); //Annahme Stelle
return 1;
}
}
Das ganze habe ich dann noch mit Roads getrennt
wofür ihr oben
new Roads[MAX_PLAYERS];
erstellen müsst
es ist eine Abfrage welche Busfahrerjob jetzt gewählt wurde damit ihr den Spieler zur annahme stelle Schicken könnt
Wir haben den Spieler ja jetzt einen festen Checkpoint gesetzt
daher gehen wir jetzt zu
OnPlayerEnterCheckpoint
wo wir unser Roads benutzen werden
public OnPlayerEnterCheckpoint(playerid)
{
if(sInfo[playerid][aktiv])
{
DisablePlayerCheckpoint(playerid);
new playercp = sInfo[playerid][Checkpoints],string[256];
if(playercp >= brInfo[sInfo[playerid][r_id]][b_cps])
}
zuerst machen wir eine Abfrage ob er einen aktivien Job haben. Dis wird in der Regel dann gesetzt nachdem er den Job angenommen hat
anschließend
wird folgendes gemacht{
sInfo[playerid][aktiv] = false;
SendClientMessage(playerid,RED,"Du hast deine Strecke abgeschlossen. Du erhälst als Belohnung einen Geldbündel mit einer Rechnung");
SendClientMessage(playerid,CL_ORANGE,"----[Rechnung]----");
new gewinn;
for(new i=0; i<brInfo[sInfo[playerid][r_id]][b_cps]; i++)
{
gewinn+=brroutes[sInfo[playerid][r_id]][i][win];
}
gewinn+=win_city_change;
format(string,sizeof(string),"Verdienst $%i + $%i Euro Stadtwechsel = %i",gewinn-win_city_change, win_city_change, gewinn);
SendClientMessage(playerid,CL_GREEEN,string);
GivePlayerMoney(playerid,gewinn);
SendClientMessage(playerid,CL_ORANGE,"----[Rechnung]----");
}
Wir setzen dem Spieler noch den Gewinn für jeden Checkpoint und addieren ihn
Er wird ihm dann als Gewinn gutgeschrieben
zum Schluss brauchen wir hier noch ein else damit wir wissen was passiert wenn er einen aktiven Job hat
else
{
SetPlayerCheckpoint(playerid,brroutes[sInfo[playerid][r_id]][playercp][b_x],brroutes[sInfo[playerid][r_id]][playercp][b_y],brroutes[sInfo[playerid][r_id]][playercp][b_z],10);
sInfo[playerid][Checkpoints] ++; // ++ ist das gleiche wie +1
}
sodass der befehl dann so aussieht if(sInfo[playerid][aktiv])
{
DisablePlayerCheckpoint(playerid);
new playercp = sInfo[playerid][Checkpoints],string[256];
if(playercp >= brInfo[sInfo[playerid][r_id]][b_cps])
{
sInfo[playerid][aktiv] = false;
SendClientMessage(playerid,RED,"Du hast deine Strecke abgeschlossen. Du erhälst als Belohnung einen Geldbündel mit einer Rechnung");
SendClientMessage(playerid,CL_ORANGE,"----[Rechnung]----");
new gewinn;
for(new i=0; i<brInfo[sInfo[playerid][r_id]][b_cps]; i++)
{
gewinn+=brroutes[sInfo[playerid][r_id]][i][win];
}
gewinn+=win_city_change;
format(string,sizeof(string),"Verdienst $%i + $%i Euro Stadtwechsel = %i",gewinn-win_city_change, win_city_change, gewinn);
SendClientMessage(playerid,CL_GREEEN,string);
GivePlayerMoney(playerid,gewinn);
SendClientMessage(playerid,CL_ORANGE,"----[Rechnung]----");
}
else
{
SetPlayerCheckpoint(playerid,brroutes[sInfo[playerid][r_id]][playercp][b_x],brroutes[sInfo[playerid][r_id]][playercp][b_y],brroutes[sInfo[playerid][r_id]][playercp][b_z],10);
sInfo[playerid][Checkpoints] ++; // ++ ist das gleiche wie +1
}
}
Nun unser aktueller Stand ist, dass der Spieler nun einen Startpunkt bekommt bzw die folgenden Checkpoints bekommt
Ich werde im OnPlayerEnterCheckpoint nun auf folgendes eingehen,
SetPlayerCheckpoint(playerid,brroutes[sInfo[playerid][r_id]][playercp][b_x],brroutes[sInfo[playerid][r_id]][playercp][b_y],brroutes[sInfo[playerid][r_id]][playercp][b_z],10);
denn dies ist unser 3Dimensionales Array was wir nun benötigen
brroutes[sInfo[playerid][r_id]][playercp][b_x]
fragt die X Koordinate der R_id ab also die RoutenID
d.h wir brauchen bei jeder Checkpoint abfrage die R_id!
if(playercp >= brInfo[sInfo[playerid][r_id]][b_cps])
fragt ab ob der Spieler die Maximale Anzahl der Checkpioints erreicht also in dem Falle 10, bzw die angegebene Zahl!
wenn ja wird der Checkpoint disabled und der Gewinn verteilt
Nun haben wir folgenden Standpunkt:
Spieler startet Job mit /startjobs und wählt Busfahrer aus
Spieler bekommt anmeldepunkt
Spieler bekommt die Checkpoints
Spieler bekommt Gewinn bei Abschluss
ich hoffe ich habe nix vergessen,
werde das ganze von der Größe anpassen und fertig editieren
LG
Stormi25