[PAWN] Votekick script
Featured Replies
Recent actief 0
- Er zijn hier geen geregistreerde gebruikers aanwezig.
Een betere weg om onze GTA community te volgen. Leer meer.
Een volledig scherm app op het beginscherm inclusief notificaties, badges en meer.
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:
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