JGuntherS Geplaatst: 12 april 2006 Rapport Geplaatst: 12 april 2006 (bewerkt) 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: 12 april 2006 door JGuntherS Reageren
Flame^ Geplaatst: 12 april 2006 Rapport Geplaatst: 12 april 2006 Good Job! Mooie tut, toegevoegd aan de PAWN Tutorial lijst. Reageren
zeroRidaa Geplaatst: 10 juli 2007 Rapport Geplaatst: 10 juli 2007 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 Reageren
disaster9876 Geplaatst: 28 juli 2009 Rapport Geplaatst: 28 juli 2009 Dus als ik dit kopiëer en in mijn script zet moet het werken? ( Ik denk het niet ) Wat moet je allemaal veranderen? Reageren
disaster9876 Geplaatst: 28 juli 2009 Rapport Geplaatst: 28 juli 2009 (bewerkt) aha,, ik heb het ff getest. 26 errors,, eerst ff leren scripten voordat ik het ga doen.. Bewerkt: 28 juli 2009 door disaster9876 Reageren
Recommended Posts
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.