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 :
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:
Zet dit in je bestaande OnPlayerDisconnect, anders maak je een nieuwe OnPlayerDisconnect:
En dan nu de verwerkingsplaats, vervang je oude OnPlayerCommandText door deze of combineer ze:
En dan nu de functie waarin het echte werk verricht wordt:
En dan nu strtok, zet dit maar helemaal onderaan, dan heb je er ook geen last van
:
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