//-----------------------------Inclusion des librairies-------------------------// #include #include #include //-------------------Directive de preprocesseur particuliéres------------------// #pragma unused ret_memcpy //---------------------------------Enumérations--------------------------------// enum { DIALOG_REGISTER, DIALOG_LOGIN, DIALOG_REGISTER_SECUR, DIALOG_AUTO_LOGIN, DIALOG_ADMIN_MENU, DIALOG_PM_INPUT, DIALOG_PM_SENT, DIALOG_PM_FAILED, DIALOG_VOTE_KICK_CONFIRM, DIALOG_VOTE_KICK_SENT, DIALOG_VOTE_KICK_FAILED, DIALOG_PLAYER_MENU, DIALOG_ADMIN_SET, DIALOG_BAN_CONFIRM, DIALOG_DEL_ACCOUNT_CONFIRM, DIALOG_DEL_ACCOUNT_DONE, DIALOG_UNBAN_INPUT, DIALOG_UNBAN_DONE, DIALOG_CFG_MENU, DIALOG_CFG_VOTE_KICK_DELAY, DIALOG_CFG_VOTE_KICK_NEEDED, DIALOG_CFG_DEFAULT_MONEY, DIALOG_CFG_MIN_PASS_LEN, DIALOG_GLOBAL_OP_DONE_MSG, } enum { MEMBER, MODO, ADMIN } //-----------------------------Definitions de macros---------------------------// #define COLOR_YELLOW 0xFFD200FF #define COLOR_RED 0xFF1E00FF #define CFGFILE "global.cfg" #define GM_NAME "Simple Base 0.4" #define playerClickedID GetPVarInt(playerid, "playerClickedID") #define OP_DONE_MSG ShowPlayerDialog(playerid, DIALOG_GLOBAL_OP_DONE_MSG, DIALOG_STYLE_MSGBOX, "Operation réussie", "Opération réussie !", "Ok", "");//La fénéantise incarnée //-----------------------------Prototype de fonctions publiques-----------------// forward AbortVoteKick(votedPlayerID); //-----------------------------Definitions de variables globales---------------// new gAdminsConnected = 0; new gMaxPlayers = 0; new gDefaultMoney; new gVoteKickDelay; new gNeededVotesToKick; new gMinPassLen; //------------------------------------Let's go---------------------------------// main() { print("\n--------------------------------------"); print(" (^o^) Simple base-mode by Jujuv (^o^)"); print("--------------------------------------\n"); return 1; } public OnGameModeInit() { SetGameModeText(GM_NAME); AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); if(!dini_Exists(CFGFILE)) { dini_Create(CFGFILE); dini_IntSet(CFGFILE, "StartingMoney", 500); dini_IntSet(CFGFILE, "VoteKickDelay", 60); dini_IntSet(CFGFILE, "NeededVotesToKick", 50); dini_IntSet(CFGFILE, "MinPassLen", 6); print("Fichier de configuration global par défaut, crée"); } else { gDefaultMoney = dini_Int(CFGFILE, "StartingMoney"); gVoteKickDelay = dini_Int(CFGFILE, "VoteKickDelay"); gNeededVotesToKick = dini_Int(CFGFILE, "NeededViotesToKick"); gMinPassLen = dini_Int(CFGFILE, "MinPassLen"); print("Configuration chargé"); } return 1; } public OnPlayerConnect(playerid) { if(gMaxPlayers < playerid) gMaxPlayers = playerid; SetPVarInt(playerid, "logued", 0);//Cette PVar est un booleen indiquant si le joueur esr logué ou non new pName[MAX_PLAYER_NAME]; GetPlayerName(playerid, pName, sizeof(pName)); if(udb_Exists(pName))//S'il existe dèja un compte ascosié à ce pseudonyme { if(udb_UserInt(pName, "Banned")) { SendClientMessage(playerid, COLOR_YELLOW, "Ce nom d'utilisateur est banni"); Kick(playerid); } else { new pIp[MAX_STRING]; GetPlayerIp(playerid, pIp, sizeof(pIp)); if(AreStringsEquals(udb_User(pName, "Last_IP"), udb_User(pName, "Registered_IP")) && AreStringsEquals(pIp, udb_User(pName, "Last_IP")))//Si la derniére IP connue du joueur est egale à celle avec laquelle il s'est inscrit et si celle-ci est egale à son IP actuelle { SetPVarInt(playerid, "logued", 1); ShowPlayerDialog(playerid, DIALOG_AUTO_LOGIN, DIALOG_STYLE_MSGBOX, "Login", "Vous avez été connécté automatiquement à votre compte", "Ok", ""); } else ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", "Veuillez entrer votre mot de passe afin de vous connecter", "Ok", "");//On demande au joueur de se loguer en entrant son mot de passe } } else//Sinon (le joueur n'a donc pas de compte) ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Enregistrement", "Veuillez entrer un mot de passe afin de vous enregistrer", "Ok", "");//On demande au joueur de saisir un mot de passe pour s'inscrire return 1; } public OnPlayerDisconnect(playerid, reason) { if(IsAdmin(playerid)) { gAdminsConnected--; } if(GetPVarInt(playerid, "VoteCount") > 0) { ResetVoteKick(); } if(playerid == gMaxPlayers) { for(new i = gMaxPlayers-1; i >= 0; i--)//TY Mini'.J'ai juste CC et changé le nom d'la var { if(IsPlayerConnected(i)) {gMaxPlayers = i; break;} } } } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { case DIALOG_LOGIN: { if(response)//Si le joueur a cliqué sur le bouton de gauche ("ok") { new pName[MAX_PLAYER_NAME]; GetPlayerName(playerid, pName, sizeof(pName)); if(udb_CheckLogin(pName, inputtext))//Si le mot de passe est correct OnPlayerLogin(playerid); else//Sinon (le mot de passe est incorrect) ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Mot de passe incorrect", "Veuillez entrer votre mot de passe afin de vous connecter", "Ok", "Annuler");//On demande au joueur de rentrer son mot de passe à nouveau } else Kick(playerid);//Sinon (il a cliqué sur le bouton de droite: "Annuler") } case DIALOG_REGISTER: { SetPVarString(playerid, "passCheck", inputtext);//On stocke le mot de passe dans une PVar temporaire if(strlen(inputtext) >= gMinPassLen)//Si le mot de passe est assez long ShowPlayerDialog(playerid, DIALOG_REGISTER_SECUR, DIALOG_STYLE_PASSWORD, "Securité", "Veuillez retaper votre mot de passe à l'identique (sécurité)", "Ok", "");//On demande au joueur de retaper le même mot de passe else//Sinon on demande au joueur d'en choisir un autre ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Mot de passe trop court", "Veuillez entrer un mot de passe afin de vous enregistrer", "Ok", ""); } case DIALOG_REGISTER_SECUR: { new pwd[MAX_STRING]; GetPVarString(playerid, "passCheck", pwd, sizeof(pwd));//On récupére le mot de passe stocké précédament if(AreStringsEquals(inputtext, pwd))//Si le mot de passe rentré la 1er fois est bien le même que celui rentré la seconde { new pName[MAX_PLAYER_NAME]; GetPlayerName(playerid, pName, sizeof(pName)); udb_Create(pName, inputtext);//On créer son compte DeletePVar(playerid, "passCheck");//On supprime la PVar qui stockais temporairement la 1er saisie de son mot de passe SetPVarInt(playerid, "logued", 1); OnPlayerRegister(playerid); OnPlayerLogin(playerid); } else//Sinon (le mot de passe ne corespond pas au 1er entré) ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Mot de passe incorrect", "Le mot de passe entrer ne coresspond pas à celui entrer précédaient\n Veuiller taper deux fois le même mot de passe", "Ok", "");//Retour à la case départ! } case DIALOG_PM_INPUT: { if(response) { if(!strlen(inputtext)) { ShowPlayerDialog(playerid, DIALOG_PM_FAILED, DIALOG_STYLE_MSGBOX, "Echc de l'envoie", "Echec de l'envoie du message (message vide)", "Ok", ""); } else if(!IsPlayerConnected(playerClickedID)) {ShowPlayerDialog(playerid, DIALOG_PM_FAILED, DIALOG_STYLE_MSGBOX, "Echc de l'envoie", "Echec de l'envoie du message (joueur non connécté ou ID invalide)", "Ok", "");} else { new pName[MAX_PLAYER_NAME], receiverName[MAX_PLAYER_NAME], msgFormated[MAX_STRING]; GetPlayerName(playerid, pName, sizeof(pName)); GetPlayerName(playerClickedID, receiverName, sizeof(receiverName)); format(msgFormated, sizeof(msgFormated), "[Message Privé]%s: %s", pName, inputtext); SendClientMessage(playerClickedID, COLOR_YELLOW, msgFormated); format(msgFormated, sizeof(msgFormated), "[Surveillance] MP de %s à %s: %s", pName, receiverName, inputtext); SendMessageToAdmins(msgFormated); ShowPlayerDialog(playerid, DIALOG_PM_SENT, DIALOG_STYLE_MSGBOX, "Message envoyé", "Message envoyé", "Ok", ""); } } } case DIALOG_PLAYER_MENU: { switch(listitem) { case 0: { ShowPlayerDialog(playerid, DIALOG_PM_INPUT, DIALOG_STYLE_INPUT, "Message Privé", "Entrez le texte de votre message:", "Envoyer", "Annuler"); } case 1: { ShowPlayerDialog(playerid, DIALOG_VOTE_KICK_CONFIRM, DIALOG_STYLE_MSGBOX, "Confirmation", "Etes vous certain de vouloir faire cela ?", "Oui", "Non"); } } } case DIALOG_VOTE_KICK_CONFIRM: { if(response) { OnPlayerVoteKick(playerid); } } case DIALOG_ADMIN_MENU: { switch(listitem) { case 0://Mettre Admin { if(GetAdminRank(playerid) >= ADMIN && GetAdminRank(playerClickedID) < ADMIN ) { ShowPlayerDialog(playerid, DIALOG_ADMIN_SET, DIALOG_STYLE_LIST, "Choisisez:", "Membre\r\nModerateur\r\nAdministrateur\r\n", "Valider", "Annuler"); } } case 1://Expulser { if(GetAdminRank(playerClickedID) == MEMBER) { new msg[MAX_STRING], pName[MAX_PLAYER_NAME]; GetPlayerName(playerClickedID, pName, sizeof(pName)); format(msg, sizeof(msg), "[Administration]%s a été éxpulsé du serveur par un moderateur ou un administrateur", pName); SendClientMessageToAll(COLOR_YELLOW, msg); Kick(playerid); } } case 2://Bannir { if(GetAdminRank(playerClickedID) == MEMBER) { ShowPlayerDialog(playerid, DIALOG_BAN_CONFIRM, DIALOG_STYLE_MSGBOX, "Confirmation", "Etes vous certains de vouloir bannir ce joueur ?", "Oui", "Non"); } } case 3://Supprimer le compte utilisateur { ShowPlayerDialog(playerid, DIALOG_DEL_ACCOUNT_CONFIRM, DIALOG_STYLE_MSGBOX, "Confirmation", "Etes vous certains de vouloir supprimer ce compte utilisateur ?", "Oui", "Non"); } case 4: { new Float:x, Float:y, Float:z; GetPlayerPos(playerClickedID, x, y, z); SetPlayerPosFindZ(playerid, x+random(20), y+random(20), z); } case 5: { if(IsPlayerLoguedIn(playerClickedID)) { if(playerid == playerClickedID) { TogglePlayerSpectating(playerid, 0); } else { TogglePlayerSpectating(playerid, 1); PlayerSpectatePlayer(playerid, playerClickedID); } } } } } case DIALOG_ADMIN_SET: { switch(listitem) { case 0://membre { SetAdminRank(playerClickedID, MEMBER); } case 1://modo { SetAdminRank(playerClickedID, MODO); } case 2://admin { SetAdminRank(playerClickedID, ADMIN); } } } case DIALOG_BAN_CONFIRM: { if(response) { new pName[MAX_PLAYER_NAME], msg[MAX_STRING]; GetPlayerName(playerClickedID, pName, sizeof(pName)); format(msg, sizeof(msg), "[Administration]%s a été banni(e) du serveur", pName); udb_UserSetInt(pName, "Banned", 1); Kick(playerClickedID); } } case DIALOG_DEL_ACCOUNT_CONFIRM: { if(response && !IsAdmin(playerClickedID)) { new pName[MAX_PLAYER_NAME]; GetPlayerName(playerClickedID, pName, sizeof(pName)); if(IsPlayerConnected(playerClickedID)) { Kick(playerClickedID); } udb_Remove(pName); ShowPlayerDialog(playerid, DIALOG_DEL_ACCOUNT_DONE, DIALOG_STYLE_MSGBOX, "Tache éfféctué", "Compte supprimé avec succés", "Ok", ""); } } case DIALOG_UNBAN_INPUT: { if(response) { if(udb_Exists(inputtext)) { if(udb_UserInt(inputtext, "Banned")) { udb_UserSetInt(inputtext, "Banned", 0); ShowPlayerDialog(playerid, DIALOG_UNBAN_DONE, DIALOG_STYLE_MSGBOX, "Debanissement" ,"Joueur débanni avec succés", "Ok", ""); } else{ SendClientMessage(playerid, COLOR_YELLOW, "[Erreur] Ce compte n'est pas banni"); } } else{ SendClientMessage(playerid, COLOR_RED, "[Erreur] Ce compte n'est pas enregistré"); } } } case DIALOG_CFG_MENU: { switch(listitem) { case 0://voteKickDelay { ShowPlayerDialog(playerid, DIALOG_CFG_VOTE_KICK_DELAY, DIALOG_STYLE_INPUT, "Configuration", "Entrer une valeur (en secondes):", "Valider", "Annuler"); } case 1://VotesKickNeeded { ShowPlayerDialog(playerid, DIALOG_CFG_VOTE_KICK_NEEDED, DIALOG_STYLE_INPUT, "Configuration", "Enttrez une valeur (int):", "Valider", "Annuler"); } case 2://MinPassLen { ShowPlayerDialog(playerid, DIALOG_CFG_MIN_PASS_LEN, DIALOG_STYLE_INPUT, "Configuration", "Entrez une valeur (int):", "Valider", "Annuler"); } case 3://DefaultMoney { ShowPlayerDialog(playerid, DIALOG_CFG_DEFAULT_MONEY, DIALOG_STYLE_INPUT, "Configuration", "Entrez une valeur (int):", "Valider", "Annuler"); } } } case DIALOG_CFG_VOTE_KICK_DELAY: { if(response) { if(strval(inputtext) >= 10) { dini_IntSet(CFGFILE, "VoteKickDelay", strval(inputtext)); gVoteKickDelay = strval(inputtext); OP_DONE_MSG } } } case DIALOG_CFG_VOTE_KICK_NEEDED: { if(response) { if(strval(inputtext) >= 10) { dini_IntSet(CFGFILE, "VoteKickNeeded", strval(inputtext)); gNeededVotesToKick = strval(inputtext); OP_DONE_MSG } } } case DIALOG_CFG_MIN_PASS_LEN: { if(response) { if(strval(inputtext) >= 5) { dini_IntSet(CFGFILE, "MinPassLen", strval(inputtext)); gMinPassLen = strval(inputtext); OP_DONE_MSG } } } case DIALOG_CFG_DEFAULT_MONEY: { if(response) { if(strval(inputtext) >= 0) { dini_IntSet(CFGFILE, "StartingMoney", strval(inputtext)); gDefaultMoney = strval(inputtext); OP_DONE_MSG } } } }//Ceci ferme le "switch" principale, faite y bien attention. return 1; } public OnPlayerUpdate(playerid) { if(GetPVarInt(playerid, "voteCount") == gNeededVotesToKick) { new msg[MAX_STRING], pName[MAX_PLAYER_NAME]; GetPlayerName(playerid, pName, sizeof(pName)); Kick(playerid); format(msg, sizeof(msg), "%s a été éxpulsé du serveur aprés un vote", pName); SendClientMessageToAll(COLOR_YELLOW, msg); } } public OnPlayerClickPlayer(playerid, clickedplayerid, source) { SetPVarInt(playerid, "clickedplayerID", clickedplayerid); if(IsAdmin(playerid)) { ShowPlayerDialog(playerid, DIALOG_ADMIN_MENU, DIALOG_STYLE_LIST, "Menu d'Administration", "Mettre Admin\r\nExpulser\r\nBannir\r\nSupprimer le compte\r\nSe TP au joueur\r\nObserver le joueur (Spec)\r\n", "Ok", "Annuler"); } else if(!gAdminsConnected) { ShowPlayerDialog(playerid, DIALOG_PLAYER_MENU, DIALOG_STYLE_LIST, "Que voulez-vous faire ?", "Envoyer un MP\r\nVoter pour l'expulsion", "Ok", ""); } else { ShowPlayerDialog(playerid, DIALOG_PM_INPUT, DIALOG_STYLE_INPUT, "Message Privé", "Entrez le texte de votre message:", "Envoyer", "Annuler"); } } public OnPlayerCommandText(playerid, cmdtext[]) { if(AreStringsEquals("/deban", cmdtext)) { if(GetAdminRank(playerid) == ADMIN) { ShowPlayerDialog(playerid, DIALOG_UNBAN_INPUT, DIALOG_STYLE_INPUT, "Debanissement", "Veuillez renseigner le pseudonyme du joueur à debannir:", "Debannir", "Annuler"); } else { SendClientMessage(playerid, COLOR_RED, "[Erreur]Cette commande est résérvé aux administrateurs"); } } else if(AreStringsEquals("/tp", cmdtext)) { if(IsAdmin(playerid)) { SetPVarInt(playerid, "tpenabled", 1); } } else if(AreStringsEquals("/cfg", cmdtext)) { if(GetAdminRank(playerid) >= ADMIN) { ShowPlayerDialog(playerid, DIALOG_CFG_MENU, DIALOG_STYLE_LIST, "Configuration:", "VoteKick Delay\r\nVotesKick Neededr\nMin Password Lenght\r\nDefault Money\r\n", "Ok", ""); } } else { SendClientMessage(playerid, COLOR_RED, "[Erreur]Commande innexistante"); } return 1; } stock IsPlayerLoguedIn(playerid)//Cette fonction permet de verifier facilement si un joueurs est logué ou non { /* NB: Il est recommandé d'utiliser directement la PVar pour savoir si le joueur est logué ou non à partir d'un autre fichier. */ if(GetPVarInt(playerid, "logued") && IsPlayerConnected(playerid)) { return true; } else{ return false;} } stock AreStringsEquals(string1[], string2[]) { /* NB: la fonction strcmp() retournant egalement 0 si une des deux chaines de carractére est vide, il est important de verigier qu'aucune des deux ne soit vide */ if(!strcmp(string1, string2) && strlen(string1) > 1 && strlen(string2) > 1)//Si les deux chaines de carractéres sont struictements identiques { return true;//on retourne vrais } else { return false;}//sinon, on retourne faux } stock SafeGivePlayerMoney(playerid, ammount) { if(IsPlayerLoguedIn(playerid)) { new pName[MAX_PLAYER_NAME]; GetPlayerName(playerid, pName, sizeof(pName)); udb_UserSetInt(pName, "Money", udb_UserInt(pName, "Money")+ammount); SetPlayerMoney(playerid, udb_UserInt(pName, "Money")); return udb_UserInt(pName, "Money"); } else{ return false;} } stock IsAdmin(playerid) { if(GetAdminRank(playerid) > MEMBER) { return true; } else{ return false;} } stock OnPlayerLogin(playerid) { new pName[MAX_PLAYER_NAME]; GetPlayerName(playerid, pName, sizeof(pName)); new pIp[MAX_STRING]; GetPlayerIp(playerid, pIp, sizeof(pIp));//On récupére l'adresse IP du joueur SetPVarInt(playerid, "logued", 1);//Le joueur est connécté SetPVarInt(playerid, "Admin", udb_UserInt(pName, "Admin")); SetPVarInt(playerid, "VoteCount", 0); SetPVarInt(playerid, "Voted", 0); if(IsAdmin(playerid)) { gAdminsConnected++; SetPVarInt(playerid, "tpenabled", 0);} if(!AreStringsEquals(udb_User(pName, "Last_IP"),pIp))//Si son adresse IP est différente de la dérniére { udb_UserSet(pName, "Last_IP", pIp);//On conserve son adresse IP } } stock OnPlayerRegister(playerid)//Attention: Cette "callback" n'est appelé que si l'inscription a réussie { new pName[MAX_PLAYER_NAME]; GetPlayerName(playerid, pName, sizeof(pName)); new pIp[MAX_STRING]; GetPlayerIp(playerid, pIp, sizeof(pIp));//On récupére l'adresse IP du joueur udb_UserSet(pName, "Registered_IP", pIp);//On stocke son adresse IP d'enregistrement udb_UserSet(pName, "Last_IP", pIp);//Comme il viens de s'enregistrer, c'est à la fois son IP d'enregistrement et sa dérniére IP connue udb_UserSetInt(pName, "Money", gDefaultMoney);//On donne au joueur la somme d'argent de depart udb_UserSetInt(pName,"Admin", MEMBER); udb_UserSetInt(pName, "Banned", 0); } stock OnPlayerVoteKick(playerid) { if(!GetPVarInt(playerid, "Voted") && IsPlayerLoguedIn(playerid))//Si le joueur n'a pas dèja voyé et qu'il est bien logué { SetPVarInt(playerid, "Voted", 1);//Cette PVar est un booleen indiquant si le joueur est en trains de participer à un "votekick" SetPVarInt(playerClickedID, "voteCount", GetPVarInt(playerClickedID, "voteCount")+1);//Cette PVar recensse le nombre de votes positives pour l'expulsion du joueur SetTimerEx("AbortVoteKick", gVoteKickDelay*1000, false, "i", playerClickedID); ShowPlayerDialog(playerid, DIALOG_VOTE_KICK_SENT, DIALOG_STYLE_MSGBOX, "Vote envoyé", "Votre vote a bien été pris en compte", "Ok", ""); } else { ShowPlayerDialog(playerid, DIALOG_VOTE_KICK_FAILED, DIALOG_STYLE_MSGBOX, "Erreur", "Vous ne pouvez voter que pour un joueur à la fois", "Ok", ""); } } stock ResetVoteKick()//Cette fonction effectue une R-à-Z des "votekick" { new i; for(i = 0; i <= gMaxPlayers;i++) { if(GetPVarInt(i, "Voted")) { SetPVarInt(i, "Voted", 0); } } } public AbortVoteKick(votedPlayerID)//Cette fonction permet d'annuler un "votekick" { SetPVarInt(votedPlayerID, "VoteCount", 0); ResetVoteKick(); } stock SetAdminRank(playerid, aRank)//Comme l'indique son nom, cette fonction permet de definire le rang "Admin" d'un joueur { new pName[MAX_PLAYER_NAME]; GetPlayerName(playerid, pName, sizeof(pName)); udb_UserSetInt(pName, "Admin", aRank); SetPVarInt(playerid, "Admin", aRank); } stock GetAdminRank(playerid)//Cette fonction permet de récupérer le rang "Admin" d'un joueur { if(IsPlayerLoguedIn(playerid)) { new pName[MAX_PLAYER_NAME]; GetPlayerName(playerid, pName, sizeof(pName)); if(udb_UserInt(pName, "Admin") != GetPVarInt(playerid, "Admin"))//Au cas où il y aurais un probléme { SetPVarInt(playerid, "Admin", udb_UserInt(pName, "Admin")); } return GetPVarInt(playerid, "Admin"); } else{ return -1; } } stock OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ) { if(IsAdmin(playerid) && GetPVarInt(playerid, "tpenabled")) { SetPlayerPosFindZ(playerid, fX, fY, fZ); } } stock SendMessageToAdmins(msg[]) { new i; for(i = 0; i <= gMaxPlayers; i++) { if(IsAdmin(i)) { SendClientMessage(i, COLOR_YELLOW, msg); } } }