Ammunation in ganz San Andreas abschließen

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




    [/align]

    3 Mal editiert, zuletzt von El_Dorado ()

  • Hier nochmal eine Gesammt übersicht:



    //==============[Definitionen]====================


    forward Ammunation(playerid);


    new Ammu[MAX_PLAYERS];
    new ImAmmu[MAX_PLAYERS] = 0;


    //==============================================



    //=============[Callbacks]========================


    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;


    }






    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); }
    }


    //==============================================



    Natürlich könnt ihr statt "PlayerToPoint" auch : "IsPlayerInRangeOfPoint" nehmen .
    Doch da ich das so in meinem Script habe und es so am verständlichsten ist,
    denke ich kann man für dies Tutorial damit leben.


    Ihr könnt es ja einfach beim Einfügen in eurem Script mit: "IsPlayerInRangeOfPoint(playerid,range,X,Y,Z);" übernehmen. ;D


    - Für PlayerToPint müsst ihr unten in eurem Script , wenn ihr es noch nicht habt , noch das hier einfügen:



    public PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z)
    {
    if(IsPlayerConnected(playerid))
    {
    new Float:oldposx, Float:oldposy, Float:oldposz;
    new Float:tempposx, Float:tempposy, Float:tempposz;
    GetPlayerPos(playerid, oldposx, oldposy, oldposz);
    tempposx = (oldposx -x);
    tempposy = (oldposy -y);
    tempposz = (oldposz -z);
    //printf("DEBUG: X:%f Y:%f Z:%f",posx,posy,posz);
    if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
    {
    return 1;
    }
    }
    return 0;
    }


    LG: El_Dorado




    [/align]

    2 Mal editiert, zuletzt von El_Dorado ()

  • Doch da ich das so in meinem Script habe und es so am verständlichsten ist.


    PlayerToPoint ist langsamer als IsPlayerInRangeOfPoint,außerdem kannst du, wenn du schon dabei bist dein Tutorial mal einrücken!
    Bearbeiten > Quellcode ansicht und dann kann man auch wunderbar TAB's (aus Pawno oder sonstwo kopiert) einfügen,macht das ganze noch übersichtlicher

  • Auch wenn des Thema schon ein bissl älter ist, nutzen tuns anscheinend doch noch ein paar :)
    if(IsPlayerInRangeOfPoint(playerid,1363.4910,-1279.8993,13.5469,20.0)) { ImAmmu[playerid] = 1; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
    if(IsPlayerInRangeOfPoint(playerid,2400.6536,-1977.2694,13.3828,20.0)) { ImAmmu[playerid] = 2; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
    if(IsPlayerInRangeOfPoint(playerid,2338.1833,61.8241,26.4844,20.0)) { ImAmmu[playerid] = 3; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
    if(IsPlayerInRangeOfPoint(playerid,238.1051,-178.7302,1.5781,20.0)) { ImAmmu[playerid] = 4; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
    if(IsPlayerInRangeOfPoint(playerid,-2090.5681,-2460.9922,30.4688,20.0)) { ImAmmu[playerid] = 5; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
    if(IsPlayerInRangeOfPoint(playerid,-2626.1147,212.5514,4.6123,20.0)) { ImAmmu[playerid] = 6; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
    if(IsPlayerInRangeOfPoint(playerid,-310.6950,829.5585,14.2422,20.0)) { ImAmmu[playerid] = 7; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
    if(IsPlayerInRangeOfPoint(playerid,-1508.6484,2606.1296,55.6866,20.0)) { ImAmmu[playerid] = 8; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
    if(IsPlayerInRangeOfPoint(playerid,2154.7163,942.6838,10.8203,20.0)) { ImAmmu[playerid] = 9; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
    if(IsPlayerInRangeOfPoint(playerid,780.8377,1871.3984,4.8832,20.0)) { ImAmmu[playerid] = 10; Ammu[playerid] = SetTimer("Ammunation",1500,0); }
    if(IsPlayerInRangeOfPoint(playerid,2535.7053,2083.8538,10.8203,20.0)) { ImAmmu[playerid] = 11; Ammu[playerid] = SetTimer("Ammunation",1500,0); }

    Dann ist alles wieder auf dem aktuellen Stand

    :D Was schaut ihr mich alle an??? Ich bin auch nur eine Signatur :D