Maps einfügen + Tor Befehl

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,


    da ich in einem Thema das schon mal erklärt habe, mache ich das nun auch in dem Tutorial bereich. Diese Tutorial richtet sich an Neulinge die nicht wissen wie und wo man eine Map einfügt. Dazu werde ich auch einen Tor befehl erläutern. Einmal einer mit Timer und einer ohne timer. Beginnen wir aber nun mit dem Tutorial
    Zuallererst fügt man die Map in den Public "OnGameModeInit" ein.
    Dazu muss die Map in CreateObject, oder CreateDynamicObject sein wenn man einen Streamer benutzt. Sollte die Map jedoch noch im MTA Fomat sein, kannst man die Map mit diesem (http://gtamap.delux-host.com/converter/) Converter auf das PAWN oder auf ein Streamer Format umwandeln.
    Hat man es dann auf dem gewünschten Format kann man es in den Public "OnGameModeInit" einfügen.


    Jetzt kommen wir zu den Toren.
    1. Die Befehl auf/zu Variante
    Zuerst muss man das Tor definieren. Somit kann man es später im Befehl bzw. in der Funktion MoveObject oder MoveDynamicObject auch anwenden. Dazu erstellen wir jetzt eine Variable.


    new Tor;


    Jetzt haben wir diese erstellt, und sie steht nur so da. Um jetzt dieser Variable ein Tor zuzuweisen gehen wir in den Public OnGameModeInit und schauen wo sich das Tor befindet. Es ist ratsam die Tore extra einzufügen, damit man es später leichter hat. Hat man das Tor gefunden schreiben wir nun folgendes:


    Tor = CreateObject(.....);
    Tor = CreateDynamicObject(....);


    Jetzt haben wir das Tor, also das Objekt auf dieser Variable. Nun können wir auch mit dem Befehl beginnen, diesen machen wir in dem Public OnPlayerCommandText. Das Grundgerüst sieht so aus.


    if(strcmp(cmdtext,"/tor",true) == 0)
    {
    return 1;
    }


    Der Befehl steht. Wenn man jetzt Ingame /tor machen würde, würde nichts passieren. Das ändern wir jetzt. Zuerst erstellen wir unter der Variable "Tor" eine neue bool.


    new bool:TorStatus = false;


    Hier bei ist anzumerken, dass ich diese Variablen Global, also über OnGameModeInit erstelle. Warum mach ich das? Der Grund dafür ist, dass ich dann diese Variablen in jedem Public oder sonstwas anwenden kann. Es kommt dann zu keinem Error wenn man das Script Compilet. Mit dem "TorStatus" können wir nun das Tor "lenken". Sprich wenn man den Befehlt einmal eingibt öffnet es sich, und wenn man den Befehl ein zweites mal eingibt schließt es sich. Um das zu ermögliche schreiben wir jetzt folgendes in den Befehl.


    if(TorStatus == false)
    {
    TorStatus = true;
    }
    else if(TorStatus == true)
    {
    TorStatus = false;
    }


    Somit bestimmen wir ob das Tor auf oder zu gehen soll. Haben wir das gemacht, kommt jetzt MoveObject oder MoveDynamicObject. Je nachdem ob man einen Streamer benutzt. Jetzt lassen wir das Tor erstmal öffnen. Dazu machen wir -10 an die Z Achse. Somit verschwindet das Tor im Boden.


    MoveObject(Tor,X,Y,Z-10,5.0);
    MobeDynamicObject(Tor,X,Y,Z-10,5.0);


    Was machen wir jetzt? Wir lassen das Objekt "Tor" welches das erstelle Tor ist um -10 in den Boden senken, und das mit der Geschwindigkeit 5. X,Y,Z sind die Koordinaten vom Tor. Also die vom CreateObject bzw. CreateDynamicObject wenn man einen Streamer benutzt. Nun ist das Tor unten, und die Variable "TorStatus" ist auf true. Wenn wir jetzt den Befehl erneut eingeben, soll das Tor ja wieder hochfahren. Das machen wir, in dem wir nun die alten Koordinaten dort wieder einfügen, also das -10 weg.


    MoveObject(Tor,X,Y,Z,5.0);
    MobeDynamicObject(Tor,X,Y,Z,5.0);


    Zusammen sieht das so aus


    if(strcmp(cmdtext,"/tor",true) == 0)
    {
    if(TorStatus == false)
    {
    MoveObject(Tor,X,Y,Z-10,5.0);
    MoveDynamicObject(Tor,X,Y,Z-10,5.0);
    TorStatus = true;
    }
    else if(TorStatus == true)
    {
    MoveObject(Tor,X,Y,Z,5.0);
    MoveDynamicObject(Tor,X,Y,Z-10,5.0);
    TorStatus = false;
    }
    return 1;
    }


    Jetzt kann man noch eine Message senden lassen wenn das Tor auf oder zu ist.


    SendClientMessage(playerid,FARBE,"Das Tor ist offen");
    SendClientMessage(playerid,FARBE,"Das Tor ist zu");


    2. Die Tor auf/zu Variante mit dem Timer


    Um das möglich zu machen, brauchen wir einen neuen Public. Wenn wir den jetzt nur so erstellen, kommt ein Warning. Man muss immer ein forward Publicname(); machen, damit alles funktioniert. Das machen wir jetzt. Diesen neuen Public mache ich ganz unten in das Script.


    forward TorZu();
    public TorZu()
    {
    return 1;
    }


    Jetzt können wir einen Timer verwenden. Dieser Timer greift nur auf einen Public zu. Alles andere würde nicht funktionieren. Wir werden nun in diesen Public schon einmal den "Schließen-Vorgang" hineinschreiben.


    public TorZu()
    {
    MoveObject(Tor,X,Y,Z,5.0);
    MoveDynamicObject(Tor,X,Y,Z,5.0);
    return 1;
    }


    Wenden wir uns nun dem Befehl zu. Diesen muss man jetzt ändern. Man macht jetzt nur den "Öffnen-Vorgang" hinein. Den "Schließen-Vorgang" übernimmt ja dann der Timer.


    if(strcmp(cmdtext,"/tor",true) == 0)
    {
    MoveObject(Tor,X,Y,Z,-10,5.0);
    MoveDynamicObject(Tor,X,Y,Z-10,5.0);
    return 1;
    }


    Auch dazu erstellen wir jetzt einen Timer der dann das Tor schließt. Dazu verwenden wir SetTimer.


    SetTimer("TorZu",2000,false);


    Was machen wir jetzt? Wir sagen dem Timer das er auf den Public "TorZu" zugreifen soll. Und zugreifen soll er erst in 2 Sekunden. (2000 Millisekunden = 2 Sekunden). Mit false sagen wir das der Timer nicht wiederholt werden soll. Wenn wir jetzt den Befehl eingeben würden, würde das Tor 1. aufgehen und 2. sich automatisch schließen. Kommen wir nun zu der Abfrage ob der Spieler in der nähe des Tores ist. Es ist sinnlos wenn man einen Tor Befehl erstellt den man dann überall anwenden kann. Deswegen gibt es eine Abfrage ob der Spieler in der nähe eines Punktes ist. Das macht man mit IsPlayerInRangeOfPoint. Dazu nehmen wir die unveränderten Koordinaten vom Tor.


    if(IsPlayerInRangeOfPoint(playerid,7.0,X,Y,Z))
    {
    //Tor Zeugs
    }
    else SendClientMessage(playerid,FARBE,"Du bist nicht in der Nähe");


    Wir fragen ab ob der Spieler in der Nähe vom Tor ist. Die Distanz kann man für sich einstellen, je nachdem wie weit man den Befehl nutzen darf/soll.


    Ich hoffe das Tutorial ist eine Hilfe für Neulinge die sich mit dem Scripten befassen wollen.