Guten Tag liebe Community,
dies ist mein erstes Tutorial auf diesem Forum, also falls ich ein paar Fehler machen könnte oder wenn das Tutorial eurer Meinung nach zu kurz sein sollte, bitte ich euch, dies in die Kommentare zu schreiben.
Zwar habe ich auch bemerkt, dass es hier einen Zoll Tutorial gibt, aber ich persönlich möchte dies ein wenig ausformulierter machen, das heißt, dass man durch einen Befehl das Tor öffnen kann und dass das Police Department durch einen Befehl den Zoll schließen kann, sodass keiner außer die Polizisten den Zoll betreten können.
Natürlich können diese den Zoll durch Helikopter betreten, aber dies ist euch überlassen, ob ihr auf eurem Server Helikopter machen möchtet oder nicht.
Fangen wir dann an.
Als allererstes würde man sagen, dass man sich die Sachen mappen muss. Dies möchte ich nicht in diesem Tutorial zeigen, ihr müsst euch zwei Tore mappen, ein Gebäude / Zollgebäude (weiß nicht, wie man so etwas nennt) und den Zoll so "schließbar" machen, dass sogar Fußgänger den Zoll nicht passagieren können. Der Idealste Ort, nach meiner Meinung, ist eine Brücke, wie z.B. die Verbindung zwischen San Fierro und Las Venturas.
Zuerst müsst ihr die Objekte in eurem Script einfügen (unter OnGameModeInit)
- Dies macht ihr deswegen unter OnGameModeInit, da wenn ihr den Server öffnet, dass die Objekte auch direkt gespawnt werden sollen, und nicht erst, wenn ihr einen Befehl eingibt, denn sonst wäre es ja sehr unpraktisch.
CreateObject(8556, 1644.19995, -25.2, 39.8, 0, 0, 22);
ZollTor [0] = CreateObject(980, 1648.30005, -17.1, 38.3, 0, 0, 198);//Gate
CreateObject(2930, 1643.80005, -19.7, 38.2, 0, 0, 22);
CreateObject(2930, 1643.80005, -19.7, 40.7, 0, 0, 21.995);
CreateObject(2930, 1641.40002, -18.9, 38, 0, 0, 105.995);
CreateObject(2930, 1640.19995, -19.3, 38, 0, 0, 105.991);
CreateObject(2930, 1640.69995, -20.7, 38, 0, 0, 23.991);
CreateObject(2930, 1640.69995, -20.7, 40.5, 0, 0, 23.989);
ZollTor [1] = CreateObject(980, 1635.19995, -21.6, 38.1, 0, 0, 19.996);//Gate
CreateObject(2930, 1630.19995, -23.8, 38.3, 0, 0, 290);
CreateObject(2930, 1630.19995, -23.7, 40.8, 0, 0, 289.995);
CreateObject(2930, 1629.30005, -24.1, 40.8, 0, 0, 289.995);
CreateObject(2930, 1629.30005, -24.1, 38.3, 0, 0, 289.995);
Vorab habe ich vergessen, dass ihr ganz oben in euer Script eine globale Variable erstellen müsst, denn diese Tore sollen ja auch auf und abschließbar sein.
new ZollTor[2]; //Dies ist die Variable für die Tore, ZollTor[0] und ZollTor[1], da Pawno es so "ließt".
Nun müssten wir uns einen Befehl erstellen, mit dem wir den Zoll öffnen. Der Zoll soll sich automatisch nach z.B. fünf Sekunden schließen. Es wäre sehr sinnvoll, wenn ihr OCMD verwenden würdet oder DCMD, RCMD oder ZCMD, da diese Kommandprozessoren viel einfacher sind, wenn ihr z.B. /kick [Spieler] [Grund / Reason] eingeben müsst. Einen Downloadlink habe ich leider nicht zur Verfügung, aber durch SuFu könnt ihr einen bekommen.
#include <ocmd>
#include <sscanf> //Mit Sscanf macht ihr die Parameter, falls ihr sie brauchen müsst
Vielleicht gehören diese beiden "Includes" nicht ins Tutorial, aber da ich mit OCMD den Befehl gescriptet habe, muss ich es auf OCMD lassen, da ich nicht viel arbeiten möchte. (fauler Arbeiter *_*)
Jetzt geht ihr ganz unten in euer Script - oder ganz oben - und macht: ocmd:zoll(playerid, params[])
Params sind die parameter, die wir in diesem Falle nicht brauchen und playerid ist derjenige, der diesen Befehl eingibt, also sprich z.B. ihr.
ocmd:zoll(playerid, params[])
{
return 1;
}
Jetzt müssen wir dem Script sagen, dass wir params nicht gebrauchen werden, deswegen müsst ihr schreiben:
#pragma unused params
Dieser Befehl sagt einfach nur, dass params nicht gebraucht wird. In diesem Falle werden wir auch params kaum gebrauchen.
ocmd:zoll(playerid, params[])
{
#pragma unused params
return 1;
}
Nun haben wir die Grundlagen erledigt. Damit meine ich die Grundlagen der OCMD-Strukturation. Jetzt müssten wir überprüfen, ob der Zoll derzeit offen ist. Dazu erstellen wir uns als erstes eine globale Variable, die wir meinetwegen ZollStatus nennen. Da wir in diesem Falle ZollStatus nicht für jeden Spieler brauchen, machen wir: new ZollStatus;
new ZollStatus;
Nun müssen wir überprüfen, ob der Zoll auch offen ist. Wir sagen jetzt mal einfach, dass 0 = Offen ist und 1 = Geschlossen.
if(ZollStatus == 0)
{
}
else
{
}
Das else habe ich deswegen gemacht, da der Zoll auch geschlossen werden kann. Wenn der Zoll offen ist, sollen sich unsere Tore bewegen. Aber durch einen Befehl gehen ja nicht die beiden Tore aufeinmal auf. Deswegen müssen wir nun überprüfen, ob der Spieler in der Nähe unseres Gates ist. Dies machen wir unter if(ZollStatus == 0).
if(ZollStatus == 0)
{
if(IsPlayerInRangeOfPoint(playerid,5.0,1648.30005, -17.1, 38.3))//IsPlayerInRangeOfPoint überprüft einfach, ob der Spieler in der Nähe unseres Tores ist (in diesem Falle). Und 5.0 ist die maximale Reichweite, die der Spieler sein darf.
Nun müssen wir das Tor bewegen. Logischerweise müsste man denken, dass das Tor auf "seiner" Stelle bleibt, da wir bisjetzt das Tor nicht bewegt haben. Dazu machen wir MoveObject, setzen uns einen Timer und senden dem Spieler eine Nachricht, dass er den Zoll erfolgreich passiert hat.
MoveObject(ZollTor[0],1648.30005, -17.1, 38.3-10,3);
SetTimer("ZollTor0",5000,false);
SendClientMessage(playerid,WEISS,"Du hast den Zoll erfolgreich passiert.");
Bisjetzt sieht unser /zoll Befehl so aus:
ocmd:zoll(playerid, params[])
{
#pragma unused params
if(ZollStatus == 0)
{
if(IsPlayerInRangeOfPoint(playerid,5.0,1648.30005, -17.1, 38.3))
{
MoveObject(ZollTor[0],1648.30005, -17.1, 38.3-10,3);
SetTimer("ZollTor0",5000,false);
SendClientMessage(playerid,WEISS,"Du hast den Zoll erfolgreich passiert.");
}
return 1;
}
Jetzt mache ich das schnell für das andere Tor:
if(IsPlayerInRangeOfPoint(playerid,5.0,1635.19995, -21.6, 38.1))
{
MoveObject(ZollTor[1],1635.19995, -21.6, 38.1-10,3);
SetTimer("ZollTor1",5000,false);
SendClientMessage(playerid,WEISS,"Du hast den Zoll erfolgreich passiert.");
}
Jetzt gehen wir zu den Timers ein. Wenn wir einen Timer erstellt haben, passiert nach diesen Millisekunden, die wir bei SetTimer geschrieben haben, etwas. Um dies zu machen, müssen wir als erstes uns einen forward erstellen und dann einen public. Aber wir müssen es so nennen, wie wir es bei SetTimer("HIER"); gemacht haben, also nach den Gänsefüßchen. (tut mir leid, wenn ich mich falsch ausdrücke).
forward ZollTor0();
forward ZollTor1();
public ZollTor0()
{
return 1;
}
public ZollTor1()
{
return 1;
}
Nun haben wir das auch erledigt. Nach abgang dieser Zeit sollen sich die Tore wieder zu ihrer position bewegen. Um dies zu machen, kopieren wir uns den MoveObject Befehl in den jeweiligen ZollTor hinein und löschen die "-10", da diese -10 unseren Tor ins tiefe bewegt.
public ZollTOr0()
{
MoveObject(ZollTor[0],1648.30005, -17.1, 38.3-,3);
return 1;
}
public ZollTor1()
{
MoveObject(ZollTor[1],1635.19995, -21.6, 38.1,3);
return 1;
}
Eigentlich ist unser Zoll Scripting ganz in Ordnung und schon fertig. Jetzt will ich euch noch zeigen, wie man überprüfen kann, ob der Zoll von der Police Department "geöffnet" wurde, also ob die Polizisten z.B. /zollstatus eingetippt haben. Wenn sie das eingetippt haben, könnt ihr den Zoll nicht passieren, doch wenn der Polizist nocheinmal /zollstatus eintippt, könnt ihr den Zoll wieder über den Befehl /zoll passieren. Da es mir sehr die Zeit gekostet hat, poste ich den ganzen Befehl hier rein:
ocmd:zollstatus(playerid, params[])
{
#pragma unused params
if(!IsPlayerLSPD(playerid))return SendClientMessage(playerid,Rot,"Du bist kein LSPD Member");
if(Zoll_Status == 0)
{
SendClientMessage(playerid,Weiß,"Das Zoll wurde erfolgreich geschlossen.");
Zoll_Status = 1;
}
else
{
SendClientMessage(playerid,Weiß,"Das Zoll wurde erfolgreich geöffnet.");
Zoll_Status = 0;
}
return 1;
}
Und unser /zoll Befehl:
ocmd:zoll(playerid, params[])
{
#pragma unused params
if(ZollStatus!= 0)return SendClientMessage(playerid,Grau,"* Das Zoll ist derzeit geschlossen!");
if(ZollStatus = 0)
{
if(IsPlayerInRangeOfPoint(playerid,5.0,1648.30005, -17.1, 38.3))
{
MoveObject(ZollTor[0],1648.30005, -17.1, 38.3-10,3);
SetTimer("ZollTor0",5000,false);
}
if(IsPlayerInRangeOfPoint(playerid,5.0,1635.19995, -21.6, 38.1))
{
MoveObject(ZollTor[1],1635.19995, -21.6, 38.1-10,3);
SendClientMessage(playerid,WEISS,"Du hast den Zoll erfolgreich passiert.");
SetTimer("ZollTor1",5000,false);
}
}
else
{
SendClientMessage(playerid,WEISS,"Der Zoll ist derzeit geschlossen.");
}
return 1;
}
Das war es schon mit dem Tutorial. Ich hoffe es hat euch gefallen. Meine harte Arbeit, dieses Tutorial zu veröffentlichen, hat 1 1/2 Stunden gedauert. Falls ich es zu kurz gemacht haben sollte, bitte in die Kommentare schreiben. Oder wenn ich das Tutorial zu unausführlich gemacht habe, bitte einfach schreiben. Kritik / Verbesserungsvorschläge, Fragen auch schreiben!