Jump to content

[tut] team vs team DM (minigame) [tut]


Morph1

Recommended Posts

[tut] team vs team DM (minigame)

hallo, ik ga jullie leren hoe je een Team VS Team DM maakt.

aangezien de team vs team van Flame een beetje oud is en er errors in zaten was ik maar van plan nog een tutorial te maken over team vs team in minigame mode.

anders als in andere tutorials leg ik hierbij ook uit hoe je een team moet laten winnen. en het is natuurlijk ook handig als mensen weten hoe ze jou gamemode moeten spelen.

(heb veel dingen in het script zelf al uitgelegd, achter bijna elk regeltje staat wat het is)

laten we maar beginnen met een Grove vs Ballas te maken.

zet dit bovenaan je script:

#include <a_samp>

#define REQUIRED_KILLS 15 //aantal kills dat nodig is om te winnen (nu 15)

#define TEAM_GROVE 1 // Team Grove
#define TEAM_BALLAS 2 // Team Ballas

#define COLOR_GREEN 0x32CD32AA // Kleur Grove
#define COLOR_PURPLE 0x9932CCAA // Kleur Ballas
#define COLOR_GREY 0xAFAFAFAA // Kleur wanneer je inactive bent
#define RED_COLOR 0xFF0000AA // rode kleur

static gTeam[MAX_PLAYERS];

als je de kleuren wilt veranderen kan je kijken op deze site

de codes die daar voor de kleuren staan moet je tussen 0x en AA zetten.

oke dan gaan we door

zet nu dit eronder :

new score[3]; // voor de puntentelling
//------------------------------------------------------------------------------
forward SetPlayerToTeamColor(playerid); // Speler naar teamkleur zetten
forward SetupPlayerForClassSelection(playerid); // Speler klaarmaken voor setup
forward SetPlayerTeamFromClass(playerid,classid); // Speler in team zetten
forward ExitTheGameMode(); // uit gamemode gaan
forward OVER(); //voor de timer
//------------------------------------------------------------------------------

dit zijn forwards om warnings te voorkomen.

de ---- lijnen zijn ervoor om het script een beetje overzichtelijk te houden, aan dit stuk hoef je niets te veranderen!

zet hieronder dit :

	main()
{
	print("\n----------------------------------");
	print("  (de naam van je gamemode) by (je naam)");
	print("----------------------------------\n");
}
//------------------------------------------------------------------------------

nou, dit is vrij duidelijk lijkt mij.

nu komen we bij de eerste callback. die worden in pawno public genoemd.

zet onder de ---- lijn dit

public OnGameModeInit()
{
SetGameModeText("(de naam van je gamemode hier)");
  	SetWorldTime(12); // hoe laat het is als deze gamemode begint, nu 12 uur 's middags.
ShowNameTags(1); // Spelers namen boven health balk aan of uit. Nu aan
ShowPlayerMarkers(1); // Blokjes op radar aan of uit? Nu aan
SetTimer("OVER", 600000, 0); // de timer

hierboven zie je de SetTimer. dat is de timer waarna de gamemode is afgelopen. wat dat OVER is komje aan het einde wel achter. de 600000 staat voor het aantal miliseconden waarop de timer loopt. ik denk altijd gewoon de laatste 3 nullen weg, dan hou je alleen de seconden over. nu dus 600 seconden = 10 minuten, dit kan je altijd veranderen. die 0 daarachter is niet belangrijk.

nu kan je beginnen met het inrichten van de gamemode, dat houd in dat je de objecten en auto's enz enz neerzet.

hier een lijstje van wat je er allemaal in kan zetten:

AddPlayerClass = de plaats waar de speler spawnt als hij een team heeft gekozen
AddStaticVehicle = een voertuig. daarachter horen de coördinaten
CreateObject = een object dat je kan maken met MTA (zie download links onderaan de tutorial
CreateGangZone =  een gang-gebied, zoals in het offline spel je de Grove, Ballas en de Vagos heb.

de CreateObject is voor objecten in je San Andreas map die er niet bij horen. deze kan je makkelijk neerzetten zoals jij het wilt in MTA Map Editor (download link onderaan tutorial)

de CreateGangZone is ervoor om een Gangzone te maken. bijvoorbeeld in het offline game het je op een gegeven moment de Grove gebieden, die zijn groen. de Ballas gebieden, die zijn dan paars. en de vagos gebieden. die zijn geel. dat zijn dus gebieden op de kaart waarbij er een rechthoekje gekleurt is, dat is het gebied van een bepaalde Gang. een plaatje zal het ook wel duidelijk maken:

250px-Gekleurde_map.jpg

als spelers van een ander team dit gebied aanvallen begint er een gang oorlog. dan begint het gebied rood te knipperen. vanaf dat moment begint het. wie vanaf dat moment de meeste kills van de 2 gebieden heeft wint dat gebied (terug). deze gebieden kan je heel makkelijk maken met Extreme Vehicle plotter. als je dit graag wilt gebruiken raad ik je aan om deze tutorial te lezen, daar staat ook gelijk de download link.

voor de AddPlayerClass en de AddStaticVehicle kan je het beste debug gebruiken, hier 2 videos, 1tje in debug en die ander legt uit wat je verder moet doen:

de map waar die addplayerclass en AddStaticVehicle in stonden heet "savedpositions"

nou, daarmee moet je de OnGameModeInit toch aardig mee kunnen opvullen. als alles daar staat zet je eronder nog

	return 1;
}

als je daarmee klaar bent zet je ---- lijn eronder en daaronder zet je dit.

public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/info", cmdtext, true, 10) == 0)
{
	SendClientMessage(playerid,RED_COLOR,"/info-nl Voor Nederlandse informatie");
	SendClientMessage(playerid,RED_COLOR,"/info-eng For English information");
	SendClientMessage(playerid,RED_COLOR,"/info-de Für Deutsche Informationen");
	return 1;
}

dit is dus als de speler /info typt. dan staat alles wat achter de sendclientmessage staat in zijn chat in de rode kleur (RED_COLOR) die je bovenaan gedefined heb. maar nu staat er /info-nl voor nederlandse informatie. en dat ook voor /info-eng en /info-du. die moet je natuurlijk ook maken. als je zelf nog niet zo goed kan vertalen kan je de google vertaler gebruiken (heb ik ook gedaan bij duits).

dus dan kan je bijvoorbeeld dit erbij doen :

	if (strcmp("/info-nl", cmdtext, true, 10) == 0)
{
	SendClientMessage(playerid,RED_COLOR,"In deze gamemode is het de bedoeling dat");
	SendClientMessage(playerid,RED_COLOR,"je als team zo snel mogelijk 15 kills heb.");
	SendClientMessage(playerid,RED_COLOR,"als niemand 15 kills heeft gaan we na 10");
	SendClientMessage(playerid,RED_COLOR,"minuten door naar de volgende gamemode");
	return 1;
}
if (strcmp("/info-eng", cmdtext, true, 10) == 0)
{
	SendClientMessage(playerid,RED_COLOR,"In this gamemode you will have to got");
	SendClientMessage(playerid,RED_COLOR,"15 kills with your team as fast as you can.");
	SendClientMessage(playerid,RED_COLOR,"As Nobody has 15 kills we wil go to the");
	SendClientMessage(playerid,RED_COLOR,"next gamemode after 10 minutes.");
	return 1;
}
if (strcmp("/info-de", cmdtext, true, 10) == 0)
{
	SendClientMessage(playerid,RED_COLOR,"In diesem Game-Mode ist die Absicht");
	SendClientMessage(playerid,RED_COLOR,"dass Sie als Team so bald wie möglich 15 kills haben.");
	SendClientMessage(playerid,RED_COLOR,"Wenn niemand hat 15 kills gehen wir nach 10");
	SendClientMessage(playerid,RED_COLOR,"Minuten auf die nächste Game-Mode");
	return 1;
}
return 0;
}

oke die text kan je veranderen naar je eigen informatie wat erbij moet, elke nieuwe regel met sendclientmessage is een nieuwe regel in de chat, zorg er dus voor dat je niet teveel regels doet, want dan kan je mischien een deel niet zien omdat die chat maar volgens mij 7 regels is. maar elk regeltje dat hier staat kan nog 3 keer zolang.

oke dat waren de commands.

nu door. zet hieronder de //--------------------------------------------------------------------- lijn weer.

onder de lijn zet je dit:

public OnPlayerConnect(playerid)
{
SetPlayerColor(playerid,COLOR_GREY); // Kleur
GameTextForPlayer(playerid,"~p~Ballas ~w~VS ~g~Groove",2000,5); // Text
return 1;
}

GameTextForPlayer komt groot in beeld, de ~P~ staat voor purple = paars. de ~w~ voor white = wit en de ~g~ voor groen. hier een lijstje van de ~~ kleuren

~N~ = Nieuwe regel
~R~ = Rood
~G~ = Groen
~B~ = Blauw
~W~ = Wit
~Y~ = Geel
~P~ = Paars

nu moet je het deel erin zetten waarbij de spelers hun poppetje kunnen kiezen. ik heb er alvast eentje gemaakt waarbij je poppetje op het huis van CJ in grove street staat. zet dit onder de rest van je script:

public SetupPlayerForClassSelection(playerid)
{
SetPlayerPos(playerid,2494.2893,-1689.2850,21.8289);
SetPlayerCameraPos(playerid,2497.2861,-1682.9554,25.3583);
SetPlayerCameraLookAt(playerid,2494.2893,-1689.2850,21.8289);
SetPlayerFacingAngle(playerid,355.7883);
return 1;
}

de SetPlayerPos is de positie waar de speler staat als hij wilt kiezen. de SetPlayerCameraPos is de positie van de camera. de hoogte daarvan is heel makkelijk te veranderen, door de 25 van de laatste coördinaat bijvoorbeeld 26 te maken zal de camera een stukje hoger staan. de SetPlayerCameraLookAt is de plek waar de camera naar kijkt. de zelfde positie van de speler dus. de SetPlayerFacingAngle is hoe je poppetje gedraait staat.

dan gaan we verder, zet dit weer onder de rest

public SetPlayerTeamFromClass(playerid,classid)
{
if(classid == 0 || classid == 1 || classid == 2) {
	gTeam[playerid] = TEAM_GROVE;
} else if(classid == 3 || classid == 4 || classid == 5) {
	gTeam[playerid] = TEAM_BALLAS;
}
}

dit is als de speler classid 0, 1 of 2 kiest word hij Team Grove dit kan je verlengen door voor het haakje achter classid 2 nog een spatie te doen, dan "||" daarna "classid ==3" maar dan moet je wel opletten dat je de onderste ook verander en dus bij de onderste de 3 een 4 word en de 4 een 5 enz.

nu moet je dat wel kunnen snappen.

het volgende:

zet dit onder je script:

public SetPlayerToTeamColor(playerid)
{
if(gTeam[playerid] == TEAM_GROVE) {
	SetPlayerColor(playerid,COLOR_GREEN); // GROEN
} else if(gTeam[playerid] == TEAM_BALLAS) {
	SetPlayerColor(playerid,COLOR_PURPLE); // PAARS
}
}

dit is dus een soort kettingreactie. als de speler nu Team Grove heeft gekozen (if(gTeam[playerid] == Team Grove)) word de kleur (SetPlayerColor) de kleur groen. die heb je boven gedefined.

vrij simpel dus.

en alweer zetten we iets onder het script, namelijk:

public OnPlayerRequestClass(playerid, classid)
{
SetupPlayerForClassSelection(playerid);
SetPlayerTeamFromClass(playerid,classid);

if(classid == 0 || classid == 1 || classid == 2) {
	GameTextForPlayer(playerid,"~G~Grove",1000,5);
} else if(classid == 3 || classid == 4 || classid == 5) {
	GameTextForPlayer(playerid,"~P~Ballas",1000,5);
}

return 1;
}

ehm. soms vind ik het ook een beetje een rare volgorde maarja ^_^. dit is weer bij het gedeelte dat de speler zijn poppetje kiest. dit is dus als de speler classid 0, 1 of 2 kiest komt er in beeld Grove. zodat ze een beter overzicht hebben waarbij het poppetje dat ze kiezen. en bij classid 3, 4 en 5 staat er Ballas.

en weer verder, daaronder zet je dit

public OnPlayerSpawn(playerid)
{
SetPlayerToTeamColor(playerid);   //zet speler naar teamkleur
SetPlayerInterior(playerid,0);	   

if(gTeam[playerid] == TEAM_GROVE) {	// als de speler Team Grove is
	GameTextForPlayer(playerid,   // text voor de speler dat groot in beeld komt
	   "vermoord zo veel mogelijk ~p~Ballas ~w~gasten",  // (de text)
	   6000,5);  // de grootte en de stijl
}
else if(gTeam[playerid] == TEAM_BALLAS) {   // als de speler Team Ballas is
	GameTextForPlayer(playerid,	// text voor de speler dat groot in beeld komt
	   "Vermoord zo veel mogelijk ~g~Grove ~w~gasten",  // (de text)
	   6000,5);	// de grootte en de stijl
}
return 1;
}

nu kunnen de meeste mensen er wel uit halen wat dit betekend, heb er nog informatie achter gezet.

en jawel, alweer, zet onder je script het volgende:

public ExitTheGameMode()
{
GameModeExit();
}

hier hoef je verder niet aan te zitten. als je dit vergeet of weglaat zal je gamemode waarschijnlijk nooit eindigen.

nu komt er een hele grote public die ik in stukjes ga behandelen.

zet dit onder de rest van je script:

public OnPlayerDeath(playerid, killerid, reason)
{
if(killerid == INVALID_PLAYER_ID) {
	SendDeathMessage(INVALID_PLAYER_ID,playerid,reason);
} else {
	if(gTeam[killerid] != gTeam[playerid]) {
		// Valid kill
		SendDeathMessage(killerid,playerid,reason);
		SetPlayerScore(killerid,GetPlayerScore(killerid)+1);
 	}
	else {
		// Team kill
		SetPlayerScore(killerid,GetPlayerScore(killerid)-1);
	}
	}

dit is voor als een speler dood is. hier kan ik bijna geen informatie over geven. want hiermee weet ik ook niet zeker wat het allemaal is. ^_^:D

naja. dan gaan we maar verder. met de rest die ik gelukkig wel snap.

	//----------TeamScore-------------------------------------------------------
if(gTeam[playerid] == TEAM_GROVE && gTeam[killerid] == TEAM_BALLAS)
{
	score[1] += 1;
}

if(gTeam[playerid] == TEAM_BALLAS && gTeam[killerid] == TEAM_GROVE)
{
	score[2] += 1;
}

dit is de puntentelling. dus als de speler van Team Grove is en het team van de vermoorde speler Team Ballas word de score van team 1 - die hebben we boven gedefined als Team Grove - word de score dus van team 1 +één. hetzelfde daaronder alleen dan andersom.

dan gaan we nu zetten wat er gebeurt als een speler een speler van zijn eigen team vermoord. anti teamkill dus:

	if(gTeam[playerid] == TEAM_GROVE && gTeam[killerid] == TEAM_GROVE)
{
	GameTextForPlayer(killerid, "~R~ Vermoord Geen Vrienden", 10000, 0);
	ResetPlayerWeapons(killerid);
	SetPlayerHealth(killerid, 1);
	GivePlayerWeapon(killerid, 5, 0);
	GivePlayerMoney(playerid,100);
	SetPlayerScore(killerid,GetPlayerScore(killerid)-1);
}
if(gTeam[playerid] == TEAM_BALLAS && gTeam[killerid] == TEAM_BALLAS)
{
	GameTextForPlayer(killerid, "~R~ Don't Kill Friends", 10000, 0);
	ResetPlayerWeapons(killerid);
	SetPlayerHealth(killerid, 1);
	GivePlayerWeapon(killerid, 10, 0);
	GivePlayerMoney(playerid,100);
	SetPlayerScore(killerid,GetPlayerScore(killerid)-1);

hier gebeurt aardig wat. er staat dus dat als Team Grove Team Grove aanvalt komt er groot in beeld te staan (GameTextForplayer) vermoord geen vrienden. de wapens van de teamkiller worden gereset (ResetPlayerweapons). zijn leven word maar 1% (SetPlayerHealth). hij krijgt als enige wapen een knuppel (GivePlayerWeapon). de speler die vermoord is krijgt 100€ (GivePlayerMoney). en bij de score van de teamkiller gaat er een punt af. allemaal hetzelfde als Team Ballas Team Ballas aanvalt.

hierbij kan je natuurlijk dingen weglaten als je vind dat dat overbodig is of er nog iets bijdoen als dat erbij moet. je kan hier alles aan veranderen. (dan moet je wel een beetje ervaring hebben met scripten)

het volgende word : wat als een team de Required_Kills heeft (bovenaan gedefined als 15)

zet dit onder de rest van je script:

	//----------SCORE STUFF-----------------------------------------------------
	SendDeathMessage(killerid,playerid,reason);
	SetPlayerScore(killerid,GetPlayerScore(killerid)+1);
}
{
if (score[1] == REQUIRED_KILLS)
{
	GameTextForAll("de ~g~Grove ~w~heeft gewonnen!",6000,0);
	SetTimer("ExitTheGameMode", 10000, 0);
}
if (score[2] == REQUIRED_KILLS)
{
	GameTextForAll("de ~p~Ballas ~w~hebben gewonnen",6000,0);
	SetTimer("ExitTheGameMode",10000,0);
}
}
return 1;
}

if score 1 staat voor als de score van team 1 =Required Kills. dat zijn her dus vijftien. komt er bij iedereen groot in beeld (GameTextForAll) de grove heeft gewonnen. op dat moment begint de timer van 10 seconden te lopen om de gamemode te beeindigen (SetTimer("ExitTheGameMode",10000,0);). en dat dus ook met team 2 (Team Ballas). als die de Required Kills hebben komt er groot in beeld de ballas hebben gewonnen en gaat dezelfde timer lopen.

nu het laatste van het script: wat als niemand 15 kills heeft na 10 minuten

zet dit onder je script :

public OVER()
{
GameTextForAll("~g~Grove ~w~en ~p~Ballas ~w~hebben allebij verloren",6000,0);
SetTimer("ExitTheGameMode",10000,0);
}

dit is de timer die we bij ongamemodeinit hebben gezet. die hadden we OVER genoemd. daarom nu de public OVER(). dit gebeurt er dus al de timer is uitgetikt

verder eigenlijk precies hetzelfde als net. als de timer van 10 minuten is afgelopen komt er in beeld Grove en Ballas hebben allebij verloren (GameTextForAll) en begint de timer van 10 seconden om de gamemode te beeindigen.

nu ben je klaar met je script. sla het op met een leuke naam ZONDER spaties. daarna druk je op compile. zet de naam van je gamemode in server.cfg en start dan samp-server.exe en spelen maar.

downloads

extreme vehicle plotter voor gangzones

MTA Map Editor om objecten in je map te zetten

winRAR om de bestanden te openen

veel plezier en suc7 met je server

Bewerkt: door Morph1
Link to comment
Delen op andere websites

Leuke tut.

maar je legt wel weinig uit

waarom gebruik je dat? en waarvoor? en hoe werkt het?

zoals je OnPlayerDeath call back

ik begrijp het maar voor iemand die net begint zou die graag willen weten wat er staat.

mischien handi als je uitlegt

waarom/waarvoor/etc

=================

public SetPlayerTeamFromClass(playerid,classid)
{
if(classid == 0 || classid == 1 || classid == 2) {
	gTeam[playerid] = TEAM_GROVE;
} else if(classid == 3 || classid == 4 || classid == 5) {
	gTeam[playerid] = TEAM_BALLAS;
}
}

waar is dit voor wat doet het? en hoe werkt het?? UITLEG?

CreateGangZone

wat doet dit? waarvoor kun je het gebruiken? hoe werkt het?

enzo kan ik er met me ogen dicht er nogwel wat uit prikken.

Ik weet het wel maar een egte beginner zou graag wat meer uitleg willen

als je nouw slimbent ga je je tut aanpassen!.

voor de beginners

ps: hopelijk ben ik eerder dan remi xD

edit: JA!! xD

Bewerkt: door Crusher!!
Link to comment
Delen op andere websites

Je tutorial is al wat duidelijker. Er zitten alleen nog fouten in het script gedeelte.

Ik pas mijn post zo aan.

public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/info", cmdtext, true, 10) == 0)
{
	SendClientMessage(playerid,RED_COLOR,"/info-nl Voor Nederlandse informatie");
	SendClientMessage(playerid,RED_COLOR,"/info-eng For English information");
	SendClientMessage(playerid,RED_COLOR,"/info-de Für Deutsche Informationen");
	return 1;
}
if (strcmp("/info-nl", cmdtext, true, 10) == 0)
{
	SendClientMessage(playerid,RED_COLOR,"In deze gamemode is het de bedoeling dat");
	SendClientMessage(playerid,RED_COLOR,"je als team zo snel mogelijk 15 kills heb.");
	SendClientMessage(playerid,RED_COLOR,"als niemand 15 kills heeft gaan we na 10");
	SendClientMessage(playerid,RED_COLOR,"minuten door naar de volgende gamemode");
	return 1;
}
if (strcmp("/info-eng", cmdtext, true, 10) == 0)
{
	SendClientMessage(playerid,RED_COLOR,"In this gamemode you will have to got");
	SendClientMessage(playerid,RED_COLOR,"15 kills with your team as fast as you can.");
	SendClientMessage(playerid,RED_COLOR,"As Nobody has 15 kills we wil go to the");
	SendClientMessage(playerid,RED_COLOR,"next gamemode after 10 minutes.");
	return 1;
}
if (strcmp("/info-de", cmdtext, true, 10) == 0)
{
	SendClientMessage(playerid,RED_COLOR,"In diesem Game-Mode ist die Absicht");
	SendClientMessage(playerid,RED_COLOR,"dass Sie als Team so bald wie möglich 15 kills haben.");
	SendClientMessage(playerid,RED_COLOR,"Wenn niemand hat 15 kills gehen wir nach 10");
	SendClientMessage(playerid,RED_COLOR,"Minuten auf die nächste Game-Mode");
	return 1;
}
return 0;
}

Je bent elke kaar return 1; vergeten, en waar je wel return 1; had staan, moet return 0; staan.

Link to comment
Delen op andere websites

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...