Hallo liebe Brotfische!
Hier präsentiere ich euch ein kleines Tutorial, mit dem ihr auf euren Server eigene Ein und Ausgänge "Installieren" könnt.
Das ist im prinzip die "Profi-Fassung" die vorallem bei vielen Ein/Ausgängen einiges an Zeilen spart!
Vorraussetzungen
Ihr benötigt die Grundkentnisse im SA-MP Scripten.
Und natürlich benötigen wir PAWO
---------------------------------------------------
1. Wir erstellen ein Enum, um nachher alles schön übersichtlich zu haben.
Da wir Positionen Abfragen wollen, brauchen wir Floats.
Hier ein Beispiel:
enum e_eingange {
Float:i_x,
Float:i_y,
Float:i_z,
Float:a_x,
Float:a_y,
Float:a_z,
interior,
world
}
Ich habe hier Präfix verwendet um es zu verdeutlichen. Alle "i_" Floats sind innen, alle "a_" Floats aussen.
2. Wir erstellen ein "new" in form einer Auflistung, um unsere Daten zu speichern.
Dabei gehen wir nach dem oben erstellten Profil vor.
Wir verbinden das "new" einfach mit unserem Enum:
new eingange[][e_eingange] = {
{i_x, i_y, i_z ,a_x ,a_y, a_z, interior, virtualworld},
{i_x, i_y, i_z ,a_x ,a_y, a_z, interior, virtualworld}
};
Bei mehreren Auflistungen müssen alle, bis auf die letzte hinter der geschwungenden Klammer mit einem Kommar versehen sein!
Erklärungen:
i_x, i_y, i_z stehen für die Koordinaten des Innenraumes.
a_x,a_y,a_z stehen für die Koordiaten des Einganges.
interior und virtualworld erklären sich glaube ich von alleine
3. Wir erstellen und Laden die Pickups durch eine "for-schleife" in unseren GameMode.
Die Schleife geht alle, von uns erstellten Ein/Ausgänge durch und erstellt diese beim starten des Gamemodes!
Ein Beispiel hier für:
public OnGameModeInit()
{
for(new i = 0; i < sizeof(eingange); i++)
{
CreatePickup(1239,1,eingange[i][a_x],eingange[i][a_y],eingange[i][a_z],-1); // Wir erstellen ein Pickup an den oben eingetragenen Koordinaten
CreatePickup(1239,1,eingange[i][i_x],eingange[i][i_y],eingange[i][i_z],-1); // Wir erstellen ein Pickup an den oben eingetragenen Koordinaten
}
}
4. Wir Fragen wieder via einer "for-schleife" ab, ob der Spieler sich beim Drücken einer Taste in Reichweite einer dieser Punkte befindet, die wir oben aufgelistet haben. Hier müssen wir allerdings deutlich zwischen Ein- und Ausgang unterscheiden, da wir beim betreten ja das Interior und ggf. die Virtuelle Welt setzen, und diese beim Verlassen einfach wieder resetten wollen.
Ein weitere Beispielcode:
public OnPlayerKeyStateChange(playerid,newkeys,oldkeys)
{
if(newkeys == KEY_SECONDARY_ATTACK)
{
for(new i = 0;i<sizeof(eingange);i++)
{
if(IsPlayerInRangeOfPoint(playerid,2.0,eingange[i][a_x],eingange[i][a_y],eingange[i][a_z]))
{
SetPlayerInterior(playerid,eingange[i][interior]); // Interior setzen
SetPlayerVirtualWorld(playerid,eingange[i][world]); // Virtualworld Setzen
SetPlayerPos(playerid,eingange[i][i_x],eingange[i][i_y],eingange[i][i_z]); // Position zu eingetragenen [i]nnenkoordinaten setzen
}
else if(IsPlayerInRangeOfPoint(playerid,2.0,eingange[i][i_x],eingange[i][i_y],eingange[i][i_z]) && GetPlayerVirtualWorld(playerid) == eingange[i][world])// Wir Fragen ab, ob die Position und die Virtual-World stimmt
{
SetPlayerInterior(playerid,0); // Interior resettem
SetPlayerVirtualWorld(playerid,0); // Virtualworld resetten
SetPlayerPos(playerid,eingange[i][a_x],eingange[i][a_y],eingange[i][a_z]); // Position zu eingetragenen [a]ussenkoordinaten setzen
}
}
}
}
Sollten weitere Fragen zu funktionen sein, werde ich es etwas genauer beschreiben.
Da dies hier allerdings im prinzip ganz Simpel ist, denke ich das es nicht viel zu erklären gibt.
Man kann unsere Auflistungen oben sogar noch mit z.B. 3D-Texten erweitern, um das ganze noch etwas abzurunden.
Mit Freundlichen Grüßen,
Firerfan
//EDIT: Kleinen Fehler verbessert
//EDIT2:
Bis jetzt wurde die Virtual-World beim verlassen nicht verglichen.
Sprich man kam immer am letzten eingetragenen Ort raus.
Habe das ganze mal fixxed.
//EDIT3: Die vorherigen "ä"'s geändert. Sollte so nun funktionieren
//EDIT4: Noch ein parr "ä"'s rausgefischt
//EDIT5: Fehler bei Schritt 4 berichtigt. Virtualworld wurde falsch verglichen