Guten Tag alle miteinander!
Ich möchte euch heute zeigen, wie man ein Tutortial anschaulich und sauber gestaltet, da das immer weniger in dieser Tutorial-Kategeorie vorzufinden ist.
Das kann ich am besten, in dem ich selber eines über ein einfaches Anfänger-Thema schreibe, nämlich über Teleports von Spielern.
Bei Teleports wird man immer zu einer Position teleportiert, die eindeutig durch 3 Koordinaten bestimmbar ist. Man erhält diese Koordinaten ganz einfach, indem man sich auf einem Server an eine Stelle stellt und dort den Command /save [Kommentar] eingibt. Nun müsst ihr in euer Rockstar Games/GTA San Andreas-Verzeichnis schauen, dort sollte eine Datei namens savedpositions.txt sein. In dieser Datei werden alle eure gespeicherten Positionen aufbewahrt. Ihr könnt dort beispielsweise so etwas vorfinden:
ZitatAddPlayerClass(212,-1061.8599,1562.4587,33.2313,32.5994,0,0,0,0,0,0); // Kommentar
-1061.8599,1562.4587,33.2313 sind die X, Y und Z Koordinaten. Direkt dahinter könnt ihr die Drehung sehen, in der ihr in dem Moment gestanden seid, hier 32.5994. Die restlichen Variablen in dieser Zeile interessieren uns nicht.
Wärt ihr zu dem Zeitpunkt des Speicherns in einem Fahrzeug gewesen, könnte das ungefähr so aussehen:
ZitatAddStaticVehicle(519,-1061.8599,1562.4587,33.2313,32.5994,1,1); //Kommentar
Auch hier gelten dieselben Koordinaten wie oben.
Um einen Teleport selbst zu erstellen, solltet ihr den Grundaufbau kennen:
SetPlayerPos(playerid,Float:X,Float:Y,Float:Z);
Hierbei wird der Spieler playerid zu den Koordinaten X, Y und Z teleportiert. Wenn man einen Spieler so teleportiert, behält er seine Drehung bei. Guckt er in diesem Moment nach Süden, schaut er auch bei seiner neuen Position nach Süden. Sollte der Spieler beim Teleport in einem Fahrzeug sein, wird er herausgerissen. Wie man das Fahrzeug mitteleportiert, seht ihr weiter unten.
SetPlayerFacingAngle(playerid,Float:A);
Diese Funktion dreht den Spieler playerid auf den Winkel A(0°-360°). Sollte A = 0.0 sein, dann schaut er nach Norden, bei A = 180.0 schaut er nach Süden.
SetPlayerInterior(playerid,int);
Diese Funktion steckt den Spieler playerid in das Interior int. Diese Funktion wird vorallem gebraucht, wenn man beispielsweise jemand in ein Haus teleportiert (Interior != 0). Jedoch sollte man bei den meisten Teleports in den freien Raum den Spieler in das Interior 0 stecken, da der Spieler den Teleport auch aus einem Haus heraus betätigen könnte.
SetPlayerVirtualWorld(playerid,virtualw);
Diese Funktion weist dem Spieler playerid die VirtualWorld virtualw zu. Dies ist beispielsweise nötig, um Spieler zwar zur gleichen Position zu bringen, jedoch so, sodass sie sich nicht gegenseitig sehen. Bsp: mehrere Verwendung von Häusern.
Mit diesen Kenntnissen können wir schon einen solchen Teleport erstellen:
SetPlayerPos(playerid,1864.5662,-1383.5651,13.4896);
SetPlayerFacingAngle(playerid,233.7254);
SetPlayerInterior(playerid,0);
SetPlayerVirtualWorld(playerid,0);
Nun stellen wir fest: Wenn wir den Teleport so nutzen, wird das Auto nicht mitteleportiert.
Wenn das Auto mitteleportiert werden soll, müsst ihr diese Funktionen benutzen:
SetVehiclePos(vehicleid,Float:X,Float:Y,Float:Z);
Hier wird das Fahrzeug vehicleid ganz einfach zu den Koordinaten X, Y und Z gebracht. (Ist wie SetPlayerPos, nur für Autos).
SetVehicleZAngle(vehicleid,Float:A);
Das Fahrzeug vehicleid wird auf den Winkel A gedreht. (Ist wie SetPlayerFacingAngle, nur für Autos).
LinkVehicleToInterior(vehicleid,int);
Das Fahrzeug vehicleid wird in das Interior int gesteckt. Dies wird aber selten benutzt, eventuell bei einer Stuntarena. (Ist wie SetPlayerInterior, nur für Autos).
SetVehicleVirtualWorld(vehicleid,virtualw);
Das Fahrzeug vehicleid wird in die VirtualWorld virtualw gesteckt.
Mit diesen Kenntnissen können wir nun einen solchen Teleport erstellen, bei dem Autos mit teleportiert werden:
new veh = GetPlayerVehicleID(playerid); // Abspeichern der FahrzeugID des Spielers => Unten dann weniger Schreibarbeit, da man nur "veh" schreiben muss
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) // Ist der Spieler der Fahrer eines Fahrzeugs?
{
SetVehiclePos(veh,1864.5662,-1383.5651,13.4896);
SetVehicleZAngle(veh,233.7254);
LinkVehicleToInterior(veh,0);
SetVehicleVirtualWorld(veh,0);
}
else
{
SetPlayerPos(playerid,1864.5662,-1383.5651,13.4896);
SetPlayerFacingAngle(playerid,233.7254);
}
SetPlayerInterior(playerid,0); // Auch wenn man mit dem Auto teleportiert wird, muss der Spieler selbst auch das Interior des Autos annehmen
SetPlayerVirtualWorld(playerid,0); // Auch wenn man mit dem Auto teleportiert wird, muss der Spieler selbst auch die VirtualWorld des Autos annehmen
Jetzt kann man einen Teleport-CMD ganz einfach von der Hand schreiben:
if(strcmp("/teleport",cmdtext,true) == 0)
{
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
SetVehiclePos(GetPlayerVehicleID(playerid),1864.5662,-1383.5651,13.4896);
SetVehicleZAngle(GetPlayerVehicleID(playerid),233.7254);
}
else
{
SetPlayerPos(playerid,1864.5662,-1383.5651,13.4896);
SetPlayerFacingAngle(playerid,233.7254);
}
// Interior und Virtualworld werden nicht berücksichtigt
return 1;
}
Wer seine Command auf DCMD basierend schreibt, kann es so machen:
// In OnPlayerCommandText:
dcmd(teleport,8,cmdtext); // teleport=Name des Commands 8=Länge des Commands cmdtext=String, in dem der Command steht
// Unten ins Script
dcmd_teleport(playerid,params[])
{
#pragma unused params // Die Parameter hinter /teleport sind uns wayne ;)
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
SetVehiclePos(GetPlayerVehicleID(playerid),1864.5662,-1383.5651,13.4896);
SetVehicleZAngle(GetPlayerVehicleID(playerid),233.7254);
}
else
{
SetPlayerPos(playerid,1864.5662,-1383.5651,13.4896);
SetPlayerFacingAngle(playerid,233.7254);
}
// Interior und Virtualworld werden nicht berücksichtigt
return 1;
}
Sollte euch diese DCMD-Methode nicht so ganz vertraut sein, könnt ihr gerne dieses Tutorial anschauen.
Natürlich muss es nicht immer ein Command sein, wieso kein Pickup?
public OnPlayerPickUpPickup(playerid,pickupid)
{
if(pickupid == teleportpickup)
{
SetPlayerPos(playerid,1864.5662,-1383.5651,13.4896);
SetPlayerFacingAngle(playerid,233.7254);
}
return 1;
}
Wenn ihr mit Pickups nicht vertraut seid, könnt ihr dieses Tutorial anschauen.
Nun denkt sicher der ein oder andere: GEHT DAS DENN NICHT EINFACHER???
Dazu habe ich einmal diese Funktion geschrieben, die einem die 10 Zeilen Schreibarbeit abnimmt. Sie befindet sich im Dateianhang. Ihr könnt sie zum Beispiel wiefolgt nutzen:
CreateTeleport(playerid,2494.0205,-1670.3756,13.3359,90.0,true,0,0,200) // Teleport mit Fahrzeug, Sicht nach Osten, Interior sowie Virtualworld auf 0 und 200 Dollar Kosten
Puhh, das war jetzt eine Menge Schreibarbeit. Ein Tutorial muss nicht immer wie Kraut und Rüben aussehen, sondern kann einem auch anschaulich und ausführlich erklären, wie etwas funktioniert.
Darum ging es mir hierbei.
Grüßle, M4rciii
Last Update: 22.12.2009 - 15:38