Teleport-Tutorial

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
  • 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:

    Zitat

    AddPlayerClass(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:

    Zitat

    AddStaticVehicle(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


    Ich scripte NICHT mehr, ich möchte mit NIEMANDEM einen Server aufmachen habe auch NICHTS mehr mit LoH zu tun, also lasst es mit den PNs!

    2 Mal editiert, zuletzt von M4rciii ()

  • Ich habe das so ausführlich gemacht, sodass es jemand verstehen kann, der es verstehen will.


    Ich meine, wenn man nicht bereit ist, dieses kleine Stück Zeit aufzubringen, dann sollte mans mit dem Scripten echt sein lassen.


    Ich scripte NICHT mehr, ich möchte mit NIEMANDEM einen Server aufmachen habe auch NICHTS mehr mit LoH zu tun, also lasst es mit den PNs!

  • Ich bin ganz neu auf diesem Gebiet, aber ich find dieses Tut einfach nur spitze


    10/10


    Mach weiter so :)


    Nicht jeder, der sich für super hält, ist ein Superheld. :love:
    ------------------------------------------------------------------------------------------------

  • So muss ein Tutorial aussehen.
    Alles erklärt !



    Hast du gut gemacht ;).

  • Funktioniert an sich genauso wie bei einem Command:
    if(pickupid == teleportpickup)
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    SetVehiclePos(GetPlayerVehicleID(playerid),x,y,z);
    SetVehicleZAngle(GetPlayerVehicleID(playerid),a);
    }
    else
    {
    SetPlayerPos(playerid,x,y,z);
    SetPlayerFacingAngle(playerid,a);
    }
    }


    Natürlich musst du einen Pickup-Typ verwenden, den man mit Autos aufnehmen kann.


    Ich scripte NICHT mehr, ich möchte mit NIEMANDEM einen Server aufmachen habe auch NICHTS mehr mit LoH zu tun, also lasst es mit den PNs!

  • Schönes Tutorial , ohne dass ich das wircklich brauche , jedoch durchlese weiß ich jetzt trotzdem wie es geht :)
    10/10 schön ausführlich , und du hast gute Beispiele gemacht.

  • Danke, jedoch gibt es den Pickup den ich brauche nicht, nähmlich das man mit dem Auto aber auch ohne Auto den Port benutzen kann.


    Idee?


    mfg
    KKM