Gangfight Teil | - Grundgerüst

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Gangfight Teil | - Grundgerüst

    [Blockierte Grafik: http://www.abload.de/img/tutorial1hpjwd.png]
    Tutorial von Vincent P. für easy-scripting.net & sa-mp.de


    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".
    [pwn]new CopCount, GangsterCount;[/pwn]
    Fachbegriff hierfür: Variablen
    Man kann das ganze auch so schreiben:
    [pwn]new CopCount;
    new GangsterCount;[/pwn]
    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:
    [pwn]new Text:Cops[2], Text:Gangster[2]; //Definierung der Textdraws[/pwn]
    [pwn]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);[/pwn]
    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:
    [pwn]Firmengebiet = GangZoneCreate(70.06725, 1307.922, 280.269, 1483.09);[/pwn]
    Eine GangZone ist wie folgt aufgebaut:
    MinX, MinY, MaxX, MaxY - wie auch die Funktion unten "IsPlayerInArea".
    Das ganze könnt ihr hier nochmal nachlesen: wiki.sa-mp.com/wiki/GangZoneCreate
    Nochmal als Grafik:
    [Blockierte Grafik: http://www.abload.de/img/demomx3rh.png]
    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:
    [pwn]new Firmengebiet;[/pwn]
    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:
    [pwn]TextDrawShowForPlayer(playerid, Cops[0]); //Textdraw zeigen
    TextDrawShowForPlayer(playerid, Cops[1]); // Same here
    TextDrawShowForPlayer(playerid, Gangster[0]); //here
    TextDrawShowForPlayer(playerid, Gangster[1]); //and here
    GangZoneShowForAll(Firmengebiet,0xFFFFFF00);//Dem Spieler die GangZone zeigen bzw. allen Spielern
    GangZoneFlashForAll(Firmengebiet,0xFFFFFF00);//Die GangZone "flashen" lassen. ;)
    [/pwn]
    Bis hier sollte alles klar sein.

    Die wichtigste Funktion: IsPlayerInArea
    Ihr fügt bitte noch folgendes hinzu unter kein Callback!
    [pwn]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;
    }[/pwn]

    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! :)
    [pwn]if(Spieler[playerid][Fraktion] == 1 && Spieler[killerid][Fraktion] == 2 && IsPlayerInArea(playerid, 70.06725, 1307.922, 280.269, 1483.09))[/pwn]
    Diese Abfrage solltet ihr anpassen, dort passiert folgendes, ich übersetze mal:
    [pwn]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))[/pwn]
    Sollte klar sein, gehe ich zumindest von aus... :)

    [pwn]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
    }[/pwn]
    Ich hoffe Anhand der Kommentare ist alles klar.

    Kommen wir nun dazu, wenn der Cop der Mörder war:
    [pwn]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
    }[/pwn]

    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:
    [pwn]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
    }[/pwn]
    und
    [pwn]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
    }[/pwn]
    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
    "Das müsste jetzt funktionieren..."

    ---
    Mit freundlichen Grüßen,
    Vincent Petritz
  • hab hier n problem
    wenn ich die gangzone betrete klappt alles...
    wenn ich sie aber verlasse kommt keine message...

    bitte um hilfe:

    [pwn]
    if(Fraktion(i,7)||Fraktion(i,8)||Fraktion(i,9))//ist er in Fraktion 1 oder 2
    {
    if(gfdrin == 0)
    {
    if(IsPlayerInArea(i, -1340.2998,2467.2646, -1243.2946, 2564.9675))
    {
    SendClientMessage(i,ROT,"Test mz1");
    gfdrin[i] = 1;
    }
    else if(IsPlayerInArea(i,-895.2408, 1464.4362, -748.8052, 1574.4431))
    {
    SendClientMessage(i,ROT,"Test mz2");
    gfdrin[i] = 1;
    }
    else if(IsPlayerInArea(i, 1224.6752, 179.5940, 1367.892, 359.0288))
    {
    SendClientMessage(i,ROT,"Test mz3");
    gfdrin[i] = 1;
    }
    else if(IsPlayerInArea(i, -483.2922, 2181.7739, -318.7735, 2269.7932))
    {
    SendClientMessage(i,ROT,"Test mz4");
    gfdrin[i] = 1;
    }
    else if(IsPlayerInArea(i, 407.7185, 1318.4215, 603.8702, 1571.1945))
    {
    SendClientMessage(i,ROT,"Test mz5");
    gfdrin[i] = 1;
    }
    else if(!IsPlayerInArea(i, -1340.2998,2467.2646, -1243.2946, 2564.9675)||!IsPlayerInArea(i,-895.2408, 1464.4362, -748.8052, 1574.4431)||!IsPlayerInArea(i, 1224.6752, 179.5940, 1367.892, 359.0288)
    ||!IsPlayerInArea(i, -483.2922, 2181.7739, -318.7735, 2269.7932)||!IsPlayerInArea(i, 407.7185, 1318.4215, 603.8702, 1571.1945))
    {
    if(gfdrin[i] == 1)
    {
    SendClientMessage(i,ROT,"Rauz gf");
    gfdrin[i] = 0;
    }
    }
    }
    }
    [/pwn]

    hab die funktion in meinem maintimer drinnen
  • habs geschafft...
    hatte die abfrage ob er nicht in der zone ist noch bei der abfrage if gfdrin == 0 drinnen

    hier:

    [pwn]
    if(Fraktion(i,7)||Fraktion(i,8)||Fraktion(i,9))//ist er in Fraktion 1 oder 2
    {
    if(gfdrin == 0)
    {
    if(IsPlayerInArea(i, -1340.2998,2467.2646, -1243.2946, 2564.9675))
    {
    SendClientMessage(i,ROT,"Test mz1");
    gfdrin[i] = 1;
    }
    else if(IsPlayerInArea(i,-895.2408, 1464.4362, -748.8052, 1574.4431))
    {
    SendClientMessage(i,ROT,"Test mz2");
    gfdrin[i] = 1;
    }
    else if(IsPlayerInArea(i, 1224.6752, 179.5940, 1367.892, 359.0288))
    {
    SendClientMessage(i,ROT,"Test mz3");
    gfdrin[i] = 1;
    }
    else if(IsPlayerInArea(i, -483.2922, 2181.7739, -318.7735, 2269.7932))
    {
    SendClientMessage(i,ROT,"Test mz4");
    gfdrin[i] = 1;
    }
    else if(IsPlayerInArea(i, 407.7185, 1318.4215, 603.8702, 1571.1945))
    {
    SendClientMessage(i,ROT,"Test mz5");
    gfdrin[i] = 1;
    }
    }
    else if(gfdrin[i] == 1)
    {
    if(!IsPlayerInArea(i, -1340.2998,2467.2646, -1243.2946, 2564.9675)&&!IsPlayerInArea(i,-895.2408, 1464.4362, -748.8052, 1574.4431)&&!IsPlayerInArea(i, 1224.6752, 179.5940, 1367.892, 359.0288)
    &&!IsPlayerInArea(i, -483.2922, 2181.7739, -318.7735, 2269.7932)&&!IsPlayerInArea(i, 407.7185, 1318.4215, 603.8702, 1571.1945))
    {
    SendClientMessage(i,ROT,"Raus gf");
    gfdrin[i] = 0;
    }
    }
    }
    [/pwn]

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Meisternuke ()