[Blockierte Grafik: http://www.abload.de/img/tutorial1hpjwd.png]
Tutorial von Vincent P. für easy-scripting.net & sa-mp.de
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:
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
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
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
---
Mit freundlichen Grüßen,
Vincent Petritz