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! Wenn das getan ist, könnten wir beliebig loslegen, die Variablen hochzuzählen, aber wir wollen das wie folgt machen: Die Textdraws Gangster[0] = TextDrawCreate(575,90,"Gangster"); 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! Kommen wir nun schon zur GangZone, die wir wie folgt "anwenden".
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.
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.
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);
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.
Die Zone
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
Sichtbarkeit des Textdraws & der GangZone Die wichtigste Funktion: IsPlayerInArea Das wichtigste: OnPlayerDeath 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 Kommen wir nun dazu, wenn der Cop der Mörder war: Und wer siegt? Ich hoffe ich konnte helfen.
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.
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.
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;
}
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...
{
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.
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
}
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.
- Vincent
#EDIT: Teil 2 hinzugefügt