Jump to content

[PAWN] Votekick script


JGuntherS

Recommended Posts

SA-MP miniscript



Votekick script

n

Ik heb een votekick scriptje gemaakt, ik heb het nog niet helemaal uitgetest (dat gaat nogal moeilijk op een 1 speler server ;)), maar in theorie zou het werken. Dit is een beetje een vervolg op deze minitutorial. De commentaren bevatten uitleg.

Zet dit onder de #includes:

#define COLOR_WHITE 0xFFFFFFAA
#define VOTE_TYPE_KICK 1
#define VOTE_DURATION 20000
#define YES_VOTES_MORE 2 // Je hebt twee jastemmen meer dan neestemmen om de speler te kicken

new gVoteIP = 0; // Is er een vote aan de gang?
new gVoteScore = 0; // Wat is de score nu?
new gVoteKickPlayerID = (-1); // Wie is de te kicken speler?
new gVoteType = 0; // Wat is het type van de vote?
new gVotedAlready[MAX_PLAYERS]; // Wie hebben er al gestemd?
new gTimerID; // De EndVote timer

forward strtok(const string[], &index); // strtok
forward EndVote(); // De functie om het einde van de vote aan te geven

Zet dit in je bestaande OnPlayerDisconnect, anders maak je een nieuwe OnPlayerDisconnect:

public OnPlayerDisconnect(playerid)
{
if (playerid == gVoteKickPlayerID) // Is de vertrekkende speler het lijdend voorwerp van de vote?
{
	gVoteIP = 0;
	gVoteType = 0;
		gVoteKickPlayerID = (-1);
	  gVoteScore = 0;
	  SendClientMessageToAll(COLOR_WHITE, "The vote ended, the player left.");
	  KillTimer(gTimerID);
}
return 1;
}

En dan nu de verwerkingsplaats, vervang je oude OnPlayerCommandText door deze of combineer ze:

public OnPlayerCommandText(playerid, cmdtext[])
{
new string[256]; // Tijdelijke string, voor de meldingen
new sendername[MAX_PLAYER_NAME+1]; // Wie wil de speler gekickt zien?
new kickplayername[MAX_PLAYER_NAME+1]; // We gaat er geschopt worden?
new cmd[256]; // Tijdelijke commandostring
new tmp[256]; // Nog een tijdelijke commandostring
new idx; // strtok's indexvariabele
new i; // teller voor de forloops

cmd = strtok(cmdtext, idx); // Eerste gebruik van strtok

if (strcmp(cmd, "/vkick", true) == 0) // Is het commando "/vkick"?
{
	tmp = strtok(cmdtext, idx); // Opnieuw strtok
	if (!strlen(tmp)) // Is /vkick zonder parameters gebruikt?
	{ 
		SendClientMessage(playerid, COLOR_WHITE, "USAGE: /vkick [playerid]");
		return 1;
	}
	gVoteKickPlayerID = strval(tmp);
	if (!IsPlayerConnected(gVoteKickPlayerID)) // Is /vkick niet gebruikt met een geldige parameter?
	{
		format(string, 256, "%d is not a connected player.", gVoteKickPlayerID);
		SendClientMessage(playerid, string);
		return 1;
	}
	if (gVoteIP == 1) // Is er al een vote aan de gang?
	{
		SendClientMessage(playerid, COLOR_WHITE, "A vote is already in progress.");
		return 1;
	}
	gVoteIP = 1; // Vote in progress!
	gVoteScore = 1; // Er is al 1 jastem (de beginner)
	gVoteType = VOTE_TYPE_KICK; // Het type van de vote
	GetPlayerName(playerid, sendername, MAX_PLAYER_NAME);
	GetPlayerName(gVoteKickPlayerID, kickplayername, MAX_PLAYER_NAME);
	format(string, 256, "%s called a vote to kick player %s.", sendername, kickplayername);
	SendClientMessageToAll(COLOR_WHITE, string); // Iedereen een melding over de vote
	SendClientMessageToAll(COLOR_WHITE, "Vote with /yes or /no."); // Basisinstructies
	for (i = 0; i <= sizeof(gVotedAlready); i++)
	{
		gVotedAlready[i] = 0; // Maak de "heeft al gestemd"-array leeg
	}
	gTimerID = SetTimer("EndVote", VOTE_DURATION, 0); // Stel de timer om de vote te beeindigen in
	return 1;
}
if (strcmp(cmdtext, "/yes", true)) // Is het een jastem?
{
	if (gVoteIP == 0) // Is er geen vote aan de gang?
	{
		SendClientMessage(playerid, COLOR_WHITE, "No vote in progress.");
		return 1;
	}
	if (gVotedAlready[playerid] == 1) // Controleer de array om te kijken of diegene al gestemd heeft
	{
		SendClientMessage(playerid, COLOR_WHITE, "You've already voted.");
		return 1;
	}
	gVotedAlready[playerid] = 1; // De speler heeft gestemd
	gVoteScore += 1; // Tel 1 bij de score op
	SendClientMessage(playerid, COLOR_WHITE, "You've voted yes!");
	return 1;
}

if (strcmp(cmdtext, "/no", true)) // Is het een neestem?
{
	if (gVoteIP == 0) // Is er geen vote aan de gang?
	{
		SendClientMessage(playerid, COLOR_WHITE, "No vote in progress.");
		return 1;
	}
	if (gVotedAlready[playerid] == 1) // Controleer de array om te kijken of diegene al gestemd heeft
	{
		SendClientMessage(playerid, COLOR_WHITE, "You've already voted.");
		return 1;
	}
	gVotedAlready[playerid] = 1; // De speler heeft gestemd
	gVoteScore -= 1; // Trek 1 van de score af
	SendClientMessage(playerid, COLOR_WHITE, "You've voted no!");
	return 1;
}

return 0; // cmdtext is geen commando, verstuur maar als chatbericht!
}

En dan nu de functie waarin het echte werk verricht wordt:

public EndVote()
{
new string[256]; // Tijdelijke meldingstring
new name[MAX_PLAYER_NAME+1]; // De naam van het slachtoffer
gVoteIP = 0; // De vote is afelopen
if (gVoteType == VOTE_TYPE_KICK) // Was het een kickvote?
{
	if (!(gVoteScore >= YES_VOTES_MORE)) // Zijn er niet genoeg jastemmen?
	{
		SendClientMessageToAll(COLOR_WHITE, "The vote did not pass.");
		gVoteType = 0;
		gVoteKickPlayerID = (-1); // De vote is afgelopen
		gVoteScore = 0;
		return;
	}
	if (IsPlayerConnected(gVoteKickPlayerID)) // Is de te kicken speler er nog?
	{
		Kick(gVoteKickPlayerID); // Kicken maar
		GetPlayerName(gVoteKickPlayerID, name, MAX_PLAYER_NAME);
		format(string, 256, "The vote passed and %s has been kicked", name); 
		SendClientMessageToAll(COLOR_WHITE, string); // Iedereen op de hoogte stellen
		gVoteType = 0;
		gVoteKickPlayerID = (-1); // De vote is afgelopen
		gVoteScore = 0;
		return;
	}
}
	gVoteType = 0;
	gVoteKickPlayerID = (-1); // De vote is afgelopen
  gVoteScore = 0;
return;
}

En dan nu strtok, zet dit maar helemaal onderaan, dan heb je er ook geen last van ;):

strtok(const string[], &index)
{
new length = strlen(string);
while ((index < length) && (string[index] <= ' '))
{
	index++;
}

new offset = index;
new result[20];
while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
{
	result[index - offset] = string[index];
	index++;
}
result[index - offset] = EOS;
return result;
}

Je kunt de #defines naar jouw wensen aanpassen, als je dit script gebruikt in 1 van je eigen scripts, zet me dan bij de credits (JGuntherS).

Veel plezier :).

Bewerkt: door JGuntherS
Link to comment
Delen op andere websites

  • 1 year later...

Kan iemand me wat zeggen ? ja ? oke :) xD

Als je een basic script al hebt en je hebt bevoorbeeld zoiets als OnPlayerCommandText niet erin staan en je plaatst dat dan gewoon eronder geeft dat dan schade aan het script of maakt dat niks uit ?

Alvast bedankt

Link to comment
Delen op andere websites

  • 2 years later...

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...