Dieses tolle Tutorial möchte ich ganz gerne mal aus der Versenkung holen. Ich bin das Tutorial gerade durchgegangen und es funktioniert wunderbar. Jedem zu empfehlen. Danke!
Checkpoints abfahren
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
Zitat
Dieses tolle Tutorial möchte ich ganz gerne mal aus der Versenkung holen
(erspart mir die schreiberei)Hallo Goldkiller
wie würdest du das denn machen wenn du mehrere Routen festlegen willst,
machst du dann für jedes ein neues Enum etc oder geht das auch in einem?also im Grunde genommen braucht jede Route ja dann eine ID
-
Beides hat mMn Vor- und Nachteile.
Was man in Beiden Fällen machen müsste, wäre zusätzlich sich die Routen-ID merken.
enum e_PlayerMuellInfo {
bool:pmi_bAktiv, // Könnte man entfernen, wenn pmi_RoutenID = 0 bedeutet Inaktiv und alles 1>= Aktiv
pmi_Checkpoint,
pmi_Route //Neu
}Ein extra enum für jede Route ist nicht so klug. Da würde ich eher nur ein extra Wert anlegen um die Route zu speichern.
Also so:
//Methode 1)
enum e_Muell {
Float:M_fX,
Float:M_fY,
Float:M_fZ,
Float:M_fRad,
M_iRoute //Neu
}
new
Muellabfuhr_Stationen[][e_Muell] = { ... };
Dann muss man aber zusätzlich durchzählen, bei welchem Index in der Variable Muellabfuhr_Stationen die Route für den Spieler beginnt und wie viele
Checkpoints diese hat (zB 12).
Also zB:ZitatRoute 1 beginnt bei Index 0 und hat 7 Checkpoints (0-6)
Route 2 beginnt bei Index 7 und hat 12 Checkpoints (7-18)
etc
Das könnte man in eine extra Variable auslagern ( zb: Muellabfuhr_Routen mit Routen-ID und Anzahl an CPs ) oder man sammelt die Information jedes mal wenn
die benötigt werden.Eine Andere Möglichkeit wäre, man legt für jede Route eine extra Variable an.
//Methode 2)
// Keine Veränderung am enum
enum e_Muell {
Float:M_fX,
Float:M_fY,
Float:M_fZ,
Float:M_fRad
}
new
Muellabfuhr_Stationen_Route1[][e_Muell] = { ... },
Muellabfuhr_Stationen_Route2[][e_Muell] = { ... },
Muellabfuhr_Stationen_Route3[][e_Muell] = { ... };
Könnte man auch machen, allerdings müsste man mit jeder neuen Route auch den Code anpassen (Abgesehen von den Daten für die Routen).
Möglich wäre auch, dass mit der Pointer Include zu machen. Damit
sollte es sogar einfacher sein,die 2. Methode umzusetzen. Bin mir aber auch nicht ganz sicher, ob das funktioniert (denke aber schon).So oder so, in Beiden Fällen müsste man den Code etwas umschreiben. Ich würde aber die 1.Methode nehmen, wenn ich sowas machen müsste.
-
hallo Goldkiller
habe nun folgendes gemacht
enum busroutenEnum{ //brInfo
Float:b_x,
Float:b_y,
Float:b_z,
Float:b_rad,
win,
r_id
}
enum busstartsenum{ //brInfo
Float:b_x,
Float:b_y,
Float:b_z,
bool:aktiv,
Checkpoints}
new brInfo[][busstartsenum] = {
{2221.6140,1866.6394,10.3858,false,10}
//{},
};
//brInfo[playerid][b_x]
//brroutes[playerid][b_x]
new brroutes[][busroutenEnum] = {
// X Y Z Radius Gewinn,RoutenID
//RoutenID 0 = LV nach LS
{2154.9355,1961.0078,10.2405,5.0,250,0},
{2178.5608,2349.9243,10.2335,5.0,250,0},
{2119.5234,2061.8625,10.2251,5.0,250,0},
{2039.7462,1005.9709,10.2359,5.0,250,0},
{1789.3076,801.3461,10.6779,5.0,250,0},
{1673.3729,-785.5421,54.4621,5.0,250,0},
{1186.4357,-934.5354,42.2987,5.0,250,0},
{958.2468,-1080.1121,24.5061,5.0,250,0},
{1028.4401,-1331.0526,12.9473,5.0,250,0},
{1151.0576,-1409.2263,13.0779,5.0,250,0}oben das ist der Startpunkt welcher zuerst aufgerufen werden soll, dann halt die mehreren unten
dann bei OnPlayerEnterCheckpoint
if(brInfo[playerid][aktiv])
{
brInfo[playerid][Checkpoints] ++; // ++ ist das gleiche wie +1
DisablePlayerCheckpoint(playerid);
new playercp = brInfo[playerid][Checkpoints];
if(playercp == sizeof(brroutes))
{
brInfo[playerid][aktiv]=false;
}
else
{
SetPlayerCheckpoint(playerid,brroutes[playerid][b_x],brroutes[playerid][b_y],brroutes[playerid][b_z],brroutes[playerid][b_rad]);
SCMTOADMIN("TEst neuer Checkpoint");
}
}und bei der Routenwahl hab ich folgendes gemacht
if (listitem == 2) //LV TO LS
{
brInfo[playerid][aktiv] = true;
SetPlayerCheckpoint(playerid,brroutes[playerid][b_x],brroutes[playerid][b_y],brroutes[playerid][b_z],brroutes[playerid][b_rad]);
Busfahrer1[playerid] = -1;
Busfahrer2[playerid] = -1;
brInfo[playerid][Checkpoints] = 0;
return 1;
}ist das so korrekt? so in deiner Vorstellung des umsetzens?
danke im vorraus
LG stormi
-
Könnte teilweise richtig sind, Fehler sind aber trotzdem drin.
if(playercp == sizeof(brroutes))
Wird nicht klappen, außer es gibt nur 1 Route. Ich hatte im vorherigen Post dazu geschrieben, dass man ebend manuell durchzählen muss wann die Route endet oder wie viele CPs man durchfahren muss bei Route X.SetPlayerCheckpoint(playerid,brroutes[playerid][b_x],brroutes[playerid][b_y],brroutes[playerid][b_z],brroutes[playerid][b_rad]);
playerid als Index schon mal gar nicht. Als Index muss der in CP gewählt werden, der in der Route als nächstes folgt. Im ursprünglichen Tutorial ist das Muellmann[playerid][pmi_Checkpoint] gewesen.Sehe außerdem nicht, wo du die aktuelle Route des Spielers in einer Variable speicherst.
Zitathallo Goldkiller
Ist deaktiviert, bekomme bewusst keine Benachrichtigung. -
Hab das ganze jetzt 3Dimensional gebaut
Goldkiller wäre bestimmt ein Tolles neues (erweitertes) Tutorial von dem Hier
-
Da du es ja anscheined 3Dimensional hinbekommen hast, kannst das Tutorial ja gerne schreiben.
-
genau das habe ich grade gemacht
sobald es freigeschaltet ist werde ich deins hier auch verlinken da es ja eine "Erweiterung" ist