Eine NO-DM Zone Erstellen

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 Leute,


    In diesen Tutorial will ich euch Zeigen wie ihr eine NO-DM Zone Erstellen könnt


    Was benötigen wir ?


    - Grundwissen
    - 5-10 Minuten
    - PAWN (oder alternativen


    ______________________________________________________________________________



    So nun fangen wir an zu Scripten:


    Als erstes Benötigen wir Positionen!
    Nur wie machen wir das?
    Es ist Ganz einfach !



    Hier ein Beispiel :



    Als erstes suchen wir uns 1 Punkt aus :




    Auf unserer GTA Karte wäre es zb Das Pinke ^^ :




    ______________________________________________________________________________


    Nun gehen wir in unsere GTA Ordner und starten den DEBUG Mode.


    Wenn wir in Spiel sind suchen wir uns unsere Stelle aus wo wir unsere no DM Haben Wollen.



    Zuerst laufen wir zu unseren Punkt 1:



    Wenn wir an diesen "Punkt 1" dann geben wir ein Befehl ein:


    /save Punkt 1


    Das gleiche machen wir nun mit Punkt 2:



    Und wieder Geben wir ein wenn wir an "Punkt 2" sind:


    /save Punkt 2


    Jetz gehen wir auf Unseren PC unter:


    Dokumente/Eigene Daten > GTA San Andreas User Files > SAMP > savedpositions


    Und öffnen nun "savedpositions"


    Wenn wir diese Datei öffnen denk kriegt man erstmal Kopfschmerzen :wacko:


    Aber so schwer ist das Garnicht.


    Was machen wir nun ?



    (Sollte das Bild zu klein sein oder Verpixelt dann Bitte einmal Draufklicken)


    ______________________________________________________________________________


    So nun haben wir die Positionen raus aber was nun ?



    Nun gehen wir in PAWN (oder Alternativen)


    Zuerst tuhen wir Unter die INCLUDES ins Script:


    new NO-DMZone1;


    und nun gehen wir zu OnGameModeInit() :



    public OnGameModeInit()
    {
    //Hier Müsste alles Stehen was ihr so Gemacht habt :)
    new NO-DMZone1; = GangZoneCreate(1248.011, 2072.804, 1439.348, 2204.319);
    return 1;
    }


    GangZoneCreate(x1,y1,x2,y2); Erstellt eine GangZone (das brauchen wir für eine NO-Dmzone)


    Auf gut deutsch bei Euren Positionen :


    AddPlayerClass(0,1492.7899,-855.9373,62.5106,195.3062,0,0,0,0,0,0); // Punkt 1
    AddPlayerClass(0,1475.5869,-886.9310,57.2933,183.5662,0,0,0,0,0,0); // Punkt 2


    ROT = x1
    ORANGE = y1
    HELLES PINK = x2
    DUNKLES BLAU = y2


    ______________________________________________________________________________


    So nun haben wir das unter OnGameModeInit() :


    public OnGameModeInit()
    {
    //Hier Müsste alles Stehen was ihr so Gemacht habt :)
    new NO-DMZone1 = GangZoneCreate(1492.7899,-855.9373,1475.5869,-886.9310);// Nun haben wir die Kordinaten Geändert
    return 1;
    }


    ______________________________________________________________________________


    Nun Gehen wir unter OnPlayerConnect(playerid) :



    public OnPlayerConnect(playerid)
    {
    //Hier Steht wieder Eures Zeug und so müsst ihr halt anpassen
    GangZoneShowForPlayer(playerid,NO-DMZone1, 0xFFFF0096);//0xFFFF0096 ist die Farbe für eure GangZone/NoDMZone !
    return 1;
    }


    ______________________________________________________________________________


    Nun haben wir Gangzone Erstellt Beispiel:



    (Zur info dieses bild habe ich schnell in Google gefunden und sind nicht unsere Kordinaten !)


    Nun wollen wir aber Abfragen ob der Spieler in eine GangZone bzw. In einer NO Dm Zone ist


    Das machen wir mit einer Abfrage:


    Wir tuhen diesen Stock lieber Ganz unten Hin :



    IsPlayerInArea(playerid, Float:MinX, Float:MinY, Float:MaxX, Float:MaxY)
    {
    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    if(X <= MinX && X >= MaxX && Y <= MinY && Y >= MaxY) {
    return 1;
    }
    return 0;
    }


    ______________________________________________________________________________


    Nun haben wir die Abfrage ob der spieler in der "Area" ist


    Das Heißt so viel er fragt ob der spieler in einer Location ist


    Nun gehen wir wieder unter den Includes und Fügen das ein :


    forward IstSpielerInArea();


    Nun müssen wir ein Timer erstellen der IstSpielerInArea aller 500 Milisekunden aufruft !


    So nun gehen wir wieder unter OnGameModeInit() :

    public OnGameModeInit()
    {
    SetTimer("IstSpielerInArea",1000,1);//ruft IstSpielerInArea immer und immer wieder in Takt von 500 Milisekunden / Halbe sekunde auf !
    return 1;
    }


    ______________________________________________________________________________


    Gleich ist es Geschafft es fehlt uns nurnoch IstSpielerInArea() :


    Wir erstellen ein neues public :



    public IstSpielerInArea()
    {
    for(new i; i<GetMaxPlayers(); i++)//Ruft alle Spieler auf die auf den Server sind
    {
    if(IsPlayerInArea(i,1492.7899,-855.9373,1475.5869,-886.9310))//Hier müssen wir wieder unsere x1,y1,x2,y2 Kordinaten einfügen !
    {

    //Was Passieren soll wenn er Drin ist
    }
    else
    {
    //Wenn er nicht drin ist
    }
    ...//Und hier Könnt ihr immer weiter machen :)
    }
    return 1;
    }


    ______________________________________________________________________________



    So nun brauchen wir noch wenn der Spieler in unserer Zone DM macht das er nach 3 Verwarnungen Getötet wird :


    Wieder unter includes :


    new NoDMWarnung[MAX_PLAYERS];


    und nun fügen wir OnPlayerTakeDamage ein :


    public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
    {
    if(issuerid != INVALID_PLAYER_ID)
    {
    if(IsPlayerInArea(isseuerid,1492.7899,-855.9373,1475.5869,-886.9310))
    NoDMWarnung[issuerid] += 1;
    SendClientMessage(issuerid,0xFF1E00FF,"* Achtung: Sie sind in einer NO-DM Zone *");
    if(NoDMWarnung[issuerid] == 4)//Wenn NoDNWarnung auf 4 Steht dann soll er
    {
    SetPlayerHealth(issuerid, 0);//Töten den Angreifen
    NoDMWarnung[issuerid] = 0;//Setz die Variable wieder auf 0
    }
    }
    return 1;
    }
    ______________________________________________________________________________


    Jetz sind wir Fertig...


    Ich hoffe mein Tutorial hat euch Geholfen und Gefallen !



    Achtung : Ihr dürft diesen Code nicht weiter Verbreiten er ist von mir Selber Geschrieben | Bei Fehlern bitte in den Tread reinschreiben !

    8 Mal editiert, zuletzt von [GEC]Der_Elite () aus folgendem Grund: Habe SetTimer("IstSpielerInArea",500,1); auf SetTimer("IstSpielerInArea",1000,1); Gestellt Habe eingefügt wenn der spieler 3 mal Schlägt das er Getötet wird

  • Zitat

    Das wird sau mäßig zu laggs fürhen


    Dann musst mann Halt interval auf 1000 Stellen :)


    Bei mir lags garnicht habe 43k Zeilen Script und lauft suppi :)


    Zitat

    Die No-DM Zone ist doch nur halb fertig? Man kann da drinnen immernoch DM betreiben


    naja auf einigen server sehe ich das die nur eine NO-DM Zone haben aber das mann dort immernoch dm machen kann


    WEnn ich zeit habe mache ich dies auch noch mit rein :|

  • Gutes Tutorial, ist für Anfänger sehr Hilfreich das ganze kann man aber ohne Timer auch Abfragen.
    Schau dir dazu den Streamer von Incognito an und folgende native:


    native CreateDynamicRectangle(Float:minx, Float:miny, Float:maxx, Float:maxy, worldid = -1, interiorid = -1, playerid = -1);
    Damit kannst du dann ganz einfach im public


    forward OnPlayerEnterDynamicArea(playerid, areaid);
    forward OnPlayerLeaveDynamicArea(playerid, areaid);
    Den No Dm Textdraw anzeigen lassen und evtl. eine Variable erstellen lassen wo du dann unter OnPlayerTakeDamag ob issuerid diese Variable auf 1 hat und dann Töten lassen falls er jemanden anderes Leben abzieht.


    Beispiel Code:


    new bool:InNoDmZone[MAX_PLAYERS];
    new NoDmArea;//Kann man auch in ein Array klatschen und dann in OnGameModeInit mit einer for loop Schleife alle No Dm Zonen erstellen


    public OnGameModeInit()
    {
    NoDmArea = CreateDynamicRectangle(Float:minx, Float:miny, Float:maxx, Float:maxy, -1, -1, -1);
    return 1;
    }


    public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
    {
    if(issuerid != INVALID_PLAYER_ID)
    {
    if(InNoDmZone[issuerid] == true)
    {
    SetPlayerHealth(issuerid, 0);//Den Angreifer sterben lassen
    }
    }
    return 1;
    }


    public OnPlayerEnterDynamicArea(playerid, areaid)
    {
    if(areaid == NoDmArea)
    {
    InNoDmZone[playerid] = true;
    }
    return 1;
    }


    public OnPlayerLeaveDynamicArea(playerid, areaid)
    {
    if(areaid == NoDmArea)
    {
    InNoDmZone[playerid] = false;
    }
    return 1;
    }
    Das ganze kann man natürlich sehr gut erweitern das der Angegriffene das Leben was er verloren hat zurück bekommt oder alle Areas in einen Array packen und dann Abfragen welche Area er betritt so braucht man nicht haufenweise Arbeit wenn man eine neue Area hinzufügt. Und du solltest vlt. noch ein Beispiel hinzufügen wenn man in der No Dm Area Deathmatch betreibt wie man das verhindern kann, ein Beispiel habe ich oben genannt. :)

  • Zitat

    Gutes Tutorial, ist für Anfänger sehr Hilfreich das ganze kann man aber ohne Timer auch Abfragen.


    1. danke dir ich dir ;)
    2. Ich finde mit einen Timer ist das Viel einfacher ^^


    Mann kann halt alles Anpassen ;)


    Zitat

    Alleine das "No-DM" sagt doch schon alles, und da erwartet man auch gleich, dass dort kein DM mehr betrieben werden kann.


    WEnn ich zeit habe mache ich dies auch noch mit rein

  • Beitrag von wurzelsep96 ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.