Gangfightsystem Teil I - Das erstellen des Grundgerüstes

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

  • Tutorial von Vincent P. für easy-scripting.net & sa-mp.de

    Teil 1: hier
    Teil 2: [ SCRIPTING ] Gangfightsystem Teil II - Speichern & Laden


    Wie ich immer wieder lese, sind einige User auf der Suche nach einem gescheiten Gangfightsystem/Gangfightscript. Das ganze möchte ich euch hier demonstrieren, ich hoffe, ich konnte den Usern, die eins suchen, hiermit weiterhelfen!


    Ich gehe davon aus ihr wollt das Script bzw. das Tutorial direkt in euren Gamemode einfügen - dann geht's mal los!
    Als erstes definieren wir den Spielstand bzw. den "Killcounter".
    new CopCount, GangsterCount;
    Fachbegriff hierfür: Variablen
    Man kann das ganze auch so schreiben:
    new CopCount;
    new GangsterCount;
    aber ich mache das gerne komprimierter.


    Wenn das getan ist, könnten wir beliebig loslegen, die Variablen hochzuzählen, aber wir wollen das wie folgt machen:
    Ein Spiel soll bis 50 gehen und dann direkt wieder von 0 anfangen, jeder Kill in einem Gebiet wird mit einem GameTextForPlayer und einem Punkt für das jeweilige Team belohnt. Das mit der Speicherung lasse ich jetzt mal weg.


    Die Textdraws
    Wir erstellen, um das spielen übersichtlich zu gestalten zwei Textdraws:
    new Text:Cops[2], Text:Gangster[2]; //Definierung der Textdraws
    Cops[0] = TextDrawCreate(575,97,"Cops");
    TextDrawFont(Cops[0],2);
    TextDrawTextSize(Cops[0], 602.000000, 121.000000);
    TextDrawBackgroundColor(Cops[0], 255);
    TextDrawFont(Cops[0], 2);
    TextDrawLetterSize(Cops[0], 0.200000, 1.000000);
    TextDrawColor(Cops[0], -1);
    TextDrawSetOutline(Cops[0], 1);
    TextDrawSetProportional(Cops[0], 1);
    TextDrawSetShadow(Cops[0], 0);

    Cops[1] = TextDrawCreate(500,97," ");
    TextDrawFont(Cops[1],2);
    TextDrawTextSize(Cops[1], 602.000000, 121.000000);
    TextDrawBackgroundColor(Cops[1], 255);
    TextDrawFont(Cops[1], 2);
    TextDrawLetterSize(Cops[1], 0.200000, 1.000000);
    TextDrawColor(Cops[1], -1);
    TextDrawSetOutline(Cops[1], 1);
    TextDrawSetProportional(Cops[1], 1);
    TextDrawSetShadow(Cops[1], 0);


    Gangster[0] = TextDrawCreate(575,90,"Gangster");
    TextDrawFont(Gangster[0],2);
    TextDrawTextSize(Gangster[0], 602.000000, 121.000000);
    TextDrawBackgroundColor(Gangster[0], 255);
    TextDrawFont(Gangster[0], 2);
    TextDrawLetterSize(Gangster[0], 0.200000, 1.000000);
    TextDrawColor(Gangster[0], -1);
    TextDrawSetOutline(Gangster[0], 1);
    TextDrawSetProportional(Gangster[0], 1);
    TextDrawSetShadow(Gangster[0], 0);

    Gangster[1] = TextDrawCreate(500,90," ");
    TextDrawFont(Gangster[1],2);
    TextDrawTextSize(Gangster[1], 602.000000, 121.000000);
    TextDrawBackgroundColor(Gangster[1], 255);
    TextDrawFont(Gangster[1], 2);
    TextDrawLetterSize(Gangster[1], 0.200000, 1.000000);
    TextDrawColor(Gangster[1], -1);
    TextDrawSetOutline(Gangster[1], 1);
    TextDrawSetProportional(Gangster[1], 1);
    TextDrawSetShadow(Gangster[1], 0);
    Auf die Textdraws möchte ich nun nicht weiter eingehen, da ich hier wiegesagt erklären möchte, wie man ein Gangfightsystem erstellt.


    Wie ihr bestimmt schon aus dem Code entnommen habt, geht es mir um ein "Cops"-"Gangster"-"Fightsystem" - wenn ihr was anderes wollt, einfach beliebig ändern! :)

    Die Zone


    Kommen wir nun schon zur GangZone, die wir wie folgt "anwenden".
    Wir schreiben unter OnGameModeInit folgendes:
    Firmengebiet = GangZoneCreate(70.06725, 1307.922, 280.269, 1483.09);
    Eine GangZone ist wie folgt aufgebaut:
    MinX, MinY, MaxX, MaxY - wie auch die Funktion unten "IsPlayerInArea".
    Das ganze könnt ihr hier nochmal nachlesen: http://wiki.sa-mp.com/wiki/GangZoneCreate
    Nochmal als Grafik:


    Rot = Die GangZone die angezeigt wird
    Punkt 2 = /save-Punkt 1 // MaxX, MaxY
    Punkt 1 = /save-Punkt 2 // MinX, MinY


    und schreiben oben in das Script:
    new Firmengebiet;
    Damit hätten wir das ganze definiert.
    Zur Erklärung, wir haben soeben eine GangZone erstellt mit den Koordinaten: MinX, MinY, MaxX, MaxY - mehr haben wir auch gar nicht gemacht bei diesem Schritt.


    Sichtbarkeit des Textdraws & der GangZone
    Wir möchten nun, das Spieler, die neu auf den Server connecten bzw. überhaupt connecten die GangZone überhaupt sehen und auch die Textdraws bestaunen können, das machen wir wie folgt: unter OnPlayerConnect schreiben wir ganz einfach folgendes:
    TextDrawShowForPlayer(playerid, Cops[0]); //Textdraw zeigen
    TextDrawShowForPlayer(playerid, Cops[1]); // Same here
    TextDrawShowForPlayer(playerid, Gangster[0]); //here
    TextDrawShowForPlayer(playerid, Gangster[1]); //and here
    Und OnPlayerSpawn:

    GangZoneShowForAll(Firmengebiet,0xFFFFFF00);//Dem Spieler die GangZone zeigen bzw. allen Spielern
    GangZoneFlashForAll(Firmengebiet,0xFFFFFF00);//Die GangZone "flashen" lassen. ;)

    Bis hier sollte alles klar sein.


    Die wichtigste Funktion: IsPlayerInArea
    Ihr fügt bitte noch folgendes hinzu unter kein Callback!
    stock IsPlayerInArea(playerid,Float:minX,Float:minY,Float:maxX,Float:maxY)
    {
    new Float:pX,Float:pY,Float:pZ;
    GetPlayerPos(playerid,pX,pY,pZ);
    if(pX >= minX && pX <= maxX && pY >= minY && pY <= maxY) return 1;
    else return 0;
    }


    Das wichtigste: OnPlayerDeath
    Im Prinzip kann es losgehen, wir springen zum wichtigsten Teil, OnPlayerDeath ... ich setze hierbei voraus, das ihr ein funktionstüchtiges Login- & Registersystem habt, die Definitionen der Fraktionen müsst ihr anpassen! :)
    if(Spieler[playerid][Fraktion] == 1 && Spieler[killerid][Fraktion] == 2 && IsPlayerInArea(playerid, 70.06725, 1307.922, 280.269, 1483.09))
    Diese Abfrage solltet ihr anpassen, dort passiert folgendes, ich übersetze mal:
    wenn(Spieler[der getötet worden ist][in Fraktion] == 1 UND Spieler[der gekillt hat][in Fraktion] == 2 UND Spieler(der getötet worden ist, in, der, gangzone, ist))
    Sollte klar sein, gehe ich zumindest von aus... :)


    if(Spieler[playerid][Fraktion] == 1 && Spieler[killerid][Fraktion] == 2 && IsPlayerInArea(playerid, 70.06725, 1307.922, 280.269, 1483.09))//1 ist jetzt mal Cops und 2 Gangster
    {
    new Str[100], Str2[5];//Definierung der Strings
    GangsterCount++;//Erhöhen der Punkte um 1
    format(Str,sizeof(Str), "[Gangfight] %d (Cops) : %d (Gangster)", CopCount, GangsterCount);//Nachricht formatieren
    SendClientMessageToAll(Farbe, Str);//Nachricht schicken
    format(Str2,sizeof(Str2), "~r~%d", GangsterCount);//Textdraw formatieren
    TextDrawSetString(Gangster[1], str);//Textdraw updaten
    }
    Ich hoffe Anhand der Kommentare ist alles klar.


    Kommen wir nun dazu, wenn der Cop der Mörder war:
    if(Spieler[playerid][Fraktion] == 2 && Spieler[killerid][Fraktion] == 1 && IsPlayerInArea(playerid, 70.06725, 1307.922, 280.269, 1483.09))
    {
    new Str[100], Str2[5];//Definierung der Strings
    CopCount++;//Erhöhen der Punkte um 1
    format(Str,sizeof(Str), "[Gangfight] %d (Cops) : %d (Gangster)", CopCount, GangsterCount);//Nachricht formatieren
    SendClientMessageToAll(Farbe, Str);//Nachricht schicken
    format(Str2,sizeof(Str2), "~b~%d", CopCount);//Textdraw formatieren
    TextDrawSetString(Cops[1], str);//Textdraw updaten
    }


    Und wer siegt?
    Gewinnen soll ja auch jemand, stimmt ja... :)
    Dazu erstellt ihr einfach eine Abfrage ob der Spielstand z.B. mehr als 50 ist oder mehr als 200, wieviel ihr auch immer wollt, das sieht z.B. so aus:
    if(CopCount > 50 && GangsterCount < 50)
    {
    SendClientMessageToAll(Farbe, "Diese Runde gewannen die Cops!");
    CopCount = 0;//Die Variable der Cops wieder auf 0 setzen
    GangsterCount = 0; // Die Variable der Gangster auf 0 setzen
    format(Str,sizeof(Str), "~r~%d", GangsterCount);//Textdraw formatieren
    TextDrawSetString(Gangster[1], Str);//Textdraw updaten
    format(Str2,sizeof(Str2), "~b~%d", CopCount);//Textdraw formatieren
    TextDrawSetString(Cops[1], Str2);//Textdraw updaten
    }
    und
    if(CopCount < 50 && GangsterCount > 50)
    {
    new Str[10], Str2[10];
    SendClientMessageToAll(Farbe, "Diese Runde gewannen die Gangster!");
    CopCount = 0;
    GangsterCount = 0;
    format(Str,sizeof(Str), "~r~%d", GangsterCount);//Textdraw formatieren
    TextDrawSetString(Gangster[1], Str);//Textdraw updaten
    format(Str2,sizeof(Str2), "~b~%d", CopCount);//Textdraw formatieren
    TextDrawSetString(Cops[1], Str2);//Textdraw updaten
    }
    das ganze unter OnPlayerDeath.
    Sprich, wenn die 50er Marke von einer der Teams erreicht worden ist, wird der Punktestand auf 0 gesetzt und es fängt von neu an.


    Ich hoffe ich konnte helfen. :P
    - Vincent


    #EDIT: Teil 2 hinzugefügt

    4 Mal editiert, zuletzt von TutNichts ()

  • GangZoneShowForAll(Firmengebiet,0xFFFFFF00);//Dem Spieler die GangZone zeigen bzw. allen Spielern
    GangZoneFlashForAll(Firmengebiet,0xFFFFFF00);//Die GangZone "flashen" lassen. ;)


    Ehm was hat das eigentlich unter OnPlayerConnect zu suchen?
    Wenn du das machst wird die Gangzone gar nicht erst angezeigt :D


    Ansonsten ein gutes Tutorial ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Nein das meinte ich nicht du hast die "Durchlässigkeit" auf nicht vorhanden(00) gestellt, das ergibt irgendwie keinen Sinn^^

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Sehr geiles Tutorial,
    abe rhabt Fehler.
    Pawno sagt:
    Undefiniertes Symbol "Str" und "Str2"...
    wo muss ich es denn definieren also wo nur Str steht habe ich zu String geändert dann gings aber beiom zweiten nicht...?

  • Ich find das Tutorial anschaulich gemacht und ist schonmal ein guter Anfang um sich ein eigenes Gangwarsystem zu erarbeiten.
    Aber wie Vincent schon gesagt hat es ist ein Tutorial und daher muss man schon eigeninitiative zeigen und daran weiter arbeiten um es seinen wünschen anzupassen

    Zitat


    Sehr geiles Tutorial,
    abe rhabt Fehler.
    Pawno sagt:
    Undefiniertes Symbol "Str" und "Str2"...
    wo muss ich es denn definieren also wo nur Str steht habe ich zu String geändert dann gings aber beiom zweiten nicht...?

    also ich weiß jetzt nicht welches du von den zwei Textdraws umgeändert hast aber du solltest es mit new Str [10], Str2[10]; definieren ist ja auch beim unteren Textdraw vorhanden ^^.

  • Nettes TuT, aber man könnte das ja im Prinzip erweitern.


    Mit Dini abspeichern, mit einem enum die Owner setzen, z.B gOwner, die Farben definieren, also wenn Fraktion XY Owner ist wird die Gangzone mit der Farbe XY angezeigt.


    for(new i; i<sizeof(FightGebiete); i++)
    {
    new color;//Erstellt eine neue Variable
    if(FightGebiete[i][gOwner] == 5){color=/////;}
    if(FightGebiete[i][gOwner] == 6){color=/////;}
    GangZoneShowForPlayer(playerid, FightGebiete[i], color);
    }


    Dann müsste man ja noch die FightGebiete oben definieren:
    new Gebiete[5][gebiet] = {
    {blablablabla}
    {blablablabla}
    };


    Ich hatte es früher so gemacht, aber hab selbst kp mehr :D. Schon laange her, hehe.


    Gebe dir 10 von 10 Punkten, sehr hilfreiches Tutorial für die Pawno Einsteiger 8)

  • Nice Tutorial.
    Werde es auf jedenfall benutzen, hoffe bei Erros und Fehlern hilst du mir ;)
    Eine Frage noch, werden die Gebiete auch Abgespeichert?

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen