Hallo liebe Leser,
ich möchte euch einmal in wenigen Schritten zeigen , wie ihr es schafft die Ammunation auf eurem ganzen Server zu schließen. Ich habe dazu schon einmal vorgearbeitet und vor jedem Ammunation in SA die Position gesaved (wird später benötigt). Bitte lest gründlich und beachtet jede Kleinichkeit.
Kommen wir zum Anfang
Schritt 1:
Wir fangen an einmal alles zu definieren was wir später brauchen werden. Dazu gehen wir ans Script Anfang. Dort fügt ihr folgendes ein:
forward Ammunation(playerid);// unter diese Funktion wird der Spieler später aus dem Laden geschmissen , sobald er ihn betreten hat.
new Ammu[MAX_PLAYERS]; // Dies wird gebraucht um dem Script zu sagen in welchem Ammunation der Spieler geht.
new ImAmmu[MAX_PLAYERS] = 0; // Um keinen Fehler zu unterlaufen wird zu Sicherheit gespeichert , dass der SPieler in einen Ammunation geht.
Schritt 2:
Nun müsst ihr ziemlich in die Mitte des Sciptes gehen. Es ist egal wo genau , es muss nur unter den DEFINES liegen. Nun müssen wir eine Abfrage erstellen , ob ein Spieler einen Innenraum betritt. Dazu nehmen wir den Callback: "OnPlayerInteriorChange" , dieser ist bei euch bereits definiert wenn ihr den Include: "a_samp" verwendet. Wir erstellen nun erstmal die Grundstruktur:
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
// Hier werden wir dann die folgendes erstellen :
//Wenn ein Spieler einen Innenraum betritt , dann soll ein Timer gestellt werden und anschließend geprüft werden , ob der Spieler in einem Ammunation nun ist.
}
Schritt 3:
Nun werden wir die voher gesavten Positionen gebrauchen. Wir fangen an unter "public OnPlayerInteriorChange" die erste Abfrage zu erstellen:
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
if(PlayerToPoint(20.0,playerid,1363.4910,-1279.8993,13.5469)) // Hier wird geguckt , wenn ein Spieler einen Innenraum betritt , ob er am Ammunation XZ war/ist.
}
ImAmmu[playerid] = 1; // sollte das der Fall sein , wird dem Script mit "ImAmmu" klar gemacht , dass der Spieler nun in den Ammunation XZ gegangen ist.
// ImAmmu[playerid] = 1; wird auf 1 gesetzt , da dies der Ammunation 1 sein soll. Beispiel: Bei Ammunation 2 = ImAmmu[playerid] = 2;
Ammu[playerid] = SetTimer("Ammunation",1500,0); // Nun wird ein timer gesetzt. Später wird dann geprüft , ob der Spieler im Ammuntion
// drinnen angekommen ist. Sollte das der Fall sein , wird er dann zurück vor den Ammunation geportet.
}
}
Da es aber 11 Ammunation giebt , müssen wir das ganze 11 mal mit anderen Positionen wiederholen. Ich habe das einmal sauber und übersichtlich getan:
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
if(PlayerToPoint(20.0,playerid,1363.4910,-1279.8993,13.5469)) { ImAmmu[playerid] = 1; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
if(PlayerToPoint(20.0,playerid,2400.6536,-1977.2694,13.3828)) { ImAmmu[playerid] = 2; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
if(PlayerToPoint(20.0,playerid,2338.1833,61.8241,26.4844)) { ImAmmu[playerid] = 3; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
if(PlayerToPoint(20.0,playerid,238.1051,-178.7302,1.5781)) { ImAmmu[playerid] = 4; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
if(PlayerToPoint(20.0,playerid,-2090.5681,-2460.9922,30.4688)) { ImAmmu[playerid] = 5; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
if(PlayerToPoint(20.0,playerid,-2626.1147,212.5514,4.6123)) { ImAmmu[playerid] = 6; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
if(PlayerToPoint(20.0,playerid,-310.6950,829.5585,14.2422)) { ImAmmu[playerid] = 7; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
if(PlayerToPoint(20.0,playerid,-1508.6484,2606.1296,55.6866)) { ImAmmu[playerid] = 8; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
if(PlayerToPoint(20.0,playerid,2154.7163,942.6838,10.8203)) { ImAmmu[playerid] = 9; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
if(PlayerToPoint(20.0,playerid,780.8377,1871.3984,4.8832)) { ImAmmu[playerid] = 10; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
if(PlayerToPoint(20.0,playerid,2535.7053,2083.8538,10.8203)) { ImAmmu[playerid] = 11; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
}
Schritt 4:
Nun müssen wir noch den CallBack: "Ammunation" erstellen und einrichten , dass der SPieler auch wieder aus dem Ammunation geworfen wird.
Dazu machen wir folgendes:
public Ammunation(playerid)
{
new Int[MAX_PLAYERS]; // Wir definieren etwas womit die Innenraumnummer (Interiorid) gespeichert wird.
for(new i = 0; i < MAX_PLAYERS; i++) // Da nach einem Timer die direkte "playerid" Übergabe nicht stattfindet , verwenden wir eine Abfrage auf alle SPieler.
{
Int[i] = GetPlayerInterior(i); // "i" ist nun der Buchstabe für alle Spieler die Online sind.
// Nun wird von jedem Spieler die Innenraum nummer genommen.
if(Int[i] > 0) // hat ein Spieler eine Innenraumnummer (Interiorid) von über 0 .. Also wenn er in einem Innenraum ist. Dann wird genauer nachgefragt.
{
if(ImAmmu[i] == 1) // Nun wird geprüft ob der Spieler in einem Ammunation ist , wenn ja dann auch welcher.
{
SetPlayerPos(i,1363.4910,-1279.8993,13.5469); // Sollte er in dem Ammunation sein , dann wird er zu dieser Position , also vor den Ammunation geportet.
SetPlayerInterior(i,0); // Seine Innenraumnummer wird auf 0 gesetzt da er sich nicht mehr im Innenraum befindet.
SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); // Anschließend noch eine NAchricht für den Spieler.
}
}
}
return 1;
}
So dies war die erleuterung für 1 Ammunation. Da er Aber 11 giebt muss das ganze 11 mal mit anderen Einstellungen wiederholt werden.
Ich habe das mal Vorbereitet:
public Ammunation(playerid)
{
new Int[MAX_PLAYERS];
for(new i = 0; i < MAX_PLAYERS; i++)
{
Int[i] = GetPlayerInterior(i);
if(Int[i] > 0)
{
if(ImAmmu[i] == 1) { SetPlayerPos(i,1363.4910,-1279.8993,13.5469); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
if(ImAmmu[i] == 2) { SetPlayerPos(i,2400.6536,-1977.2694,13.3828); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
if(ImAmmu[i] == 3) { SetPlayerPos(i,2338.1833,61.8241,26.4844); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
if(ImAmmu[i] == 4) { SetPlayerPos(i,238.1051,-178.7302,1.5781); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
if(ImAmmu[i] == 5) { SetPlayerPos(i,-2090.5681,-2460.9922,30.4688); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
if(ImAmmu[i] == 6) { SetPlayerPos(i,-2626.1147,212.5514,4.6123); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
if(ImAmmu[i] == 7) { SetPlayerPos(i,-310.6950,829.5585,14.2422); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
if(ImAmmu[i] == 8) { SetPlayerPos(i,-1508.6484,2606.1296,55.6866); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
if(ImAmmu[i] == 9) { SetPlayerPos(i,2154.7163,942.6838,10.8203); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
if(ImAmmu[i] == 10) { SetPlayerPos(i,780.8377,1871.3984,4.8832); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
if(ImAmmu[i] == 11) { SetPlayerPos(i,2535.7053,2083.8538,10.8203); SetPlayerInterior(i,0); SendClientMessage(i,COLOR_RED,"Waffenladen ist geschlossen!"); }
}
}
return 1;
}
So nun ist es geschafft. Geht nun ein Spieler auf eurem Server in einen Ammunation , dann wird er sofort wieder rausgeportet mit der NAchricht: "Waffenladen geschlossen!"
Vielen Dank fürs Lesen und betrachten! Ich hoffe ich konnte damit einigen helfen!
LG: El_Dorado