08.10.2010, 22:48
I just debugged this code...
no responsibility for any bugs in commands or so...
no responsibility for any bugs in commands or so...
Код:
#include <a_samp> #include <dini> #include <dutils> #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1 #define GREEN 0x33AA33AA #define RED 0xAA3333AA #define YELLOW 0xFFFF00AA #define BLUE 0x33CCFFAA #define ORANGE 0xFF9900AA #define PlayerFile "accounts/%s.ini" #define SettingFile "settings/MainSettings.ini" #define CommandFile "settings/Commands.ini" #pragma unused ret_memcpy enum PLAYER_MAIN { PLAYER_NAME[MAX_PLAYER_NAME], PLAYER_IP[16], PLAYER_REGGED, PLAYER_PASS, PLAYER_LOGGED, PLAYER_LEVEL, PLAYER_WIRED, PLAYER_JAILED } enum SETTINGS_MAIN { POCKET_MONEY, JAIL_COMMANDS, ANNOUNCE_SECONDS, PASS_MIN, PASS_MAX } enum COMMANDS_MAIN { AKILL, ANNOUNCE, ARMOURALL, BAN, CARHP, EXPLODE, FLIP, GOTO, GETHERE, GIVEARMOUR, GIVEHEALTH, GIVEWEAPON, GOD, HEALALL, IMITATE, IP, KICK, MAXAMMO, PING, SETLEVEL, SETWANTED, TBAN, TIME, WEATHER } new gPlayerInfo[MAX_PLAYERS][PLAYER_MAIN]; new gSettings[SETTINGS_MAIN]; new gCommands[COMMANDS_MAIN]; main() { print(" -------------------------------"); print(" Eternal RP - Eternal Develoment"); print(" -------------------------------"); } public OnGameModeInit() { SetGameModeText("ERPB"); AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); if(!fexist(SettingFile)) { dini_Create(SettingFile); dini_IntSet(SettingFile, "PocketMoney", 3000); dini_IntSet(SettingFile, "JailCommands", 0); dini_IntSet(SettingFile, "AnnounceSeconds", 3); dini_IntSet(SettingFile, "PassMin", 3); dini_IntSet(SettingFile, "PassMax", 15); } gSettings[POCKET_MONEY] = dini_Int(SettingFile, "PocketMoney"); gSettings[JAIL_COMMANDS] = dini_Int(SettingFile, "JailCommands"); gSettings[ANNOUNCE_SECONDS] = dini_Int(SettingFile, "AnnounceSeconds"); gSettings[PASS_MIN] = dini_Int(SettingFile, "PassMin"); gSettings[PASS_MAX] = dini_Int(SettingFile, "PassMax"); if(!fexist(CommandFile)) { dini_Create(CommandFile); dini_IntSet(CommandFile, "Akill", 6); dini_IntSet(CommandFile, "Announce", 5); dini_IntSet(CommandFile, "Armourall", 3); dini_IntSet(CommandFile, "Ban", 9); dini_IntSet(CommandFile, "Carhp", 4); dini_IntSet(CommandFile, "Explode", 5); dini_IntSet(CommandFile, "Goto", 4); dini_IntSet(CommandFile, "Gethere", 5); dini_IntSet(CommandFile, "Givearmour", 6); dini_IntSet(CommandFile, "Givehealth", 6); dini_IntSet(CommandFile, "Giveweapon", 7); dini_IntSet(CommandFile, "God", 10); dini_IntSet(CommandFile, "Healall", 7); dini_IntSet(CommandFile, "Imitate", 8); dini_IntSet(CommandFile, "Ip", 2); dini_IntSet(CommandFile, "Kick", 7); dini_IntSet(CommandFile, "Maxammo", 8); dini_IntSet(CommandFile, "Ping", 1); dini_IntSet(CommandFile, "Setlevel", 10); dini_IntSet(CommandFile, "Setwanted", 6); dini_IntSet(CommandFile, "Tban", 9); dini_IntSet(CommandFile, "Time", 3); dini_IntSet(CommandFile, "Weather", 3); } gCommands[AKILL] = dini_Int(CommandFile, "Akill"); gCommands[ANNOUNCE] = dini_Int(CommandFile, "Announce"); gCommands[ARMOURALL] = dini_Int(CommandFile, "Armourall"); gCommands[BAN] = dini_Int(CommandFile, "Ban"); gCommands[CARHP] = dini_Int(CommandFile, "Carhp"); gCommands[EXPLODE] = dini_Int(CommandFile, "Explode"); gCommands[GOTO] = dini_Int(CommandFile, "Goto"); gCommands[GETHERE] = dini_Int(CommandFile, "Gethere"); gCommands[GIVEARMOUR] = dini_Int(CommandFile, "Givearmour"); gCommands[GIVEHEALTH] = dini_Int(CommandFile, "Givehealth"); gCommands[GIVEWEAPON] = dini_Int(CommandFile, "Giveweapon"); gCommands[GOD] = dini_Int(CommandFile, "God"); gCommands[HEALALL] = dini_Int(CommandFile, "Healall"); gCommands[IMITATE] = dini_Int(CommandFile, "Imitate"); gCommands[IP] = dini_Int(CommandFile, "Ip"); gCommands[KICK] = dini_Int(CommandFile, "Kick"); gCommands[MAXAMMO] = dini_Int(CommandFile, "Maxammo"); gCommands[SETLEVEL] = dini_Int(CommandFile, "Setlevel"); gCommands[SETWANTED] = dini_Int(CommandFile, "Setwanted"); gCommands[TBAN] = dini_Int(CommandFile, "Tban"); gCommands[TIME] = dini_Int(CommandFile, "Time"); gCommands[WEATHER] = dini_Int(CommandFile, "Weather"); return 1; } public OnGameModeExit() { return 1; } public OnPlayerRequestClass(playerid, classid) { SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746); return 1; } public OnPlayerConnect(playerid) { new file[100],Name[MAX_PLAYER_NAME],Ip[16]; GetPlayerName(playerid,Name,sizeof(Name)); GetPlayerIp(playerid,Ip,sizeof(Ip)); format(file,sizeof(file),PlayerFile,Name); if(!dini_Exists(file)) { dini_Create(file); dini_Set(file,"Name",Name); dini_Set(file,"Ip",Ip); dini_IntSet(file,"Registered",-1); dini_IntSet(file,"Password",0); dini_IntSet(file,"Level",0); dini_IntSet(file,"Wired",0); dini_IntSet(file,"Jailed",0); SendClientMessage(playerid, ORANGE,"Your username is not recognized on this server. Please /register to continue."); } strcat(gPlayerInfo[playerid][PLAYER_NAME], dini_Get(file,"Name")); strcat(gPlayerInfo[playerid][PLAYER_IP], dini_Get(file,"Ip")); gPlayerInfo[playerid][PLAYER_REGGED] = dini_Int(file,"Registered"); gPlayerInfo[playerid][PLAYER_PASS] = dini_Int(file,"Password"); gPlayerInfo[playerid][PLAYER_LEVEL] = dini_Int(file,"Level"); gPlayerInfo[playerid][PLAYER_WIRED] = dini_Int(file,"Wired"); gPlayerInfo[playerid][PLAYER_JAILED] = dini_Int(file,"Jailed"); if(gPlayerInfo[playerid][PLAYER_REGGED] == 0) { SendClientMessage(playerid, ORANGE,"You're username is recognised on this server, but you have not registered. Please /register to continue."); } else if (gPlayerInfo[playerid][PLAYER_REGGED] == 1) { SendClientMessage(playerid, ORANGE,"You're username is recognised on this server. Please /login to continue."); } gPlayerInfo[playerid][PLAYER_REGGED] = 0; return 1; } public OnPlayerDisconnect(playerid, reason) { new file[100]; format(file,sizeof(file),PlayerFile,gPlayerInfo[playerid][PLAYER_NAME]); dini_Set(file,"Name",gPlayerInfo[playerid][PLAYER_NAME]); dini_Set(file,"Ip",gPlayerInfo[playerid][PLAYER_IP]); dini_IntSet(file,"Registered",gPlayerInfo[playerid][PLAYER_REGGED]); dini_IntSet(file,"Password",gPlayerInfo[playerid][PLAYER_PASS]); dini_IntSet(file,"Level",gPlayerInfo[playerid][PLAYER_LEVEL]); dini_IntSet(file,"Wired",gPlayerInfo[playerid][PLAYER_WIRED]); dini_IntSet(file,"Jailed",gPlayerInfo[playerid][PLAYER_JAILED]); gPlayerInfo[playerid][PLAYER_NAME] = 0; gPlayerInfo[playerid][PLAYER_IP] = 0; gPlayerInfo[playerid][PLAYER_REGGED] = 0; gPlayerInfo[playerid][PLAYER_LOGGED] = 0; gPlayerInfo[playerid][PLAYER_PASS] = 0; gPlayerInfo[playerid][PLAYER_LEVEL] = 0; gPlayerInfo[playerid][PLAYER_WIRED] = 0; gPlayerInfo[playerid][PLAYER_JAILED] = 0; return 1; } public OnPlayerSpawn(playerid) { return 1; } public OnPlayerDeath(playerid, killerid, reason) { return 1; } public OnVehicleSpawn(vehicleid) { return 1; } public OnVehicleDeath(vehicleid, killerid) { return 1; } public OnPlayerText(playerid, text[]) { return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { dcmd(register, 8, cmdtext); dcmd(login, 5, cmdtext); dcmd(logout, 6, cmdtext); dcmd(password, 8, cmdtext); dcmd(akill, 5, cmdtext); dcmd(announce, 8, cmdtext); return 0; } dcmd_register(playerid, params[]){ if(gPlayerInfo[playerid][PLAYER_REGGED] == 1) { return SendClientMessage(playerid, ORANGE, "ERROR: You have already registered!"); } else if(!params[0]) { return SendClientMessage(playerid, ORANGE, "USAGE: /register [password]"); } else if(strlen(params) < gSettings[PASS_MIN] || strlen(params) > gSettings[PASS_MAX]) { new string[128]; format(string, sizeof(string), "ERROR: Password must be between %d and $d characters long!", gSettings[PASS_MIN], gSettings[PASS_MAX]); return SendClientMessage(playerid, ORANGE, string); } else { new password = num_hash(params); gPlayerInfo[playerid][PLAYER_PASS] = password; gPlayerInfo[playerid][PLAYER_REGGED] = 1; gPlayerInfo[playerid][PLAYER_LOGGED] = 1; GetPlayerIp(playerid, gPlayerInfo[playerid][PLAYER_IP], 16); new string[128]; format(string, sizeof(string), "You have successfully registered your account with the password \'%s\'. You have been automatically logged in.", params); return SendClientMessage(playerid, BLUE, string); } } dcmd_login(playerid, params[]) { if(gPlayerInfo[playerid][PLAYER_REGGED] != 1) { return SendClientMessage(playerid, ORANGE, "ERROR: You must register first to do that! Use /register [password] to register and login."); } else if(gPlayerInfo[playerid][PLAYER_LOGGED] == 1) { return SendClientMessage(playerid, ORANGE, "ERROR: You are already logged-in."); } else if(!params[0]) { return SendClientMessage(playerid, ORANGE, "USAGE: /login [password]"); } else { new password = num_hash(params); if(gPlayerInfo[playerid][PLAYER_PASS] == password) { gPlayerInfo[playerid][PLAYER_LOGGED] = 1; GetPlayerIp(playerid, gPlayerInfo[playerid][PLAYER_IP], 16); return SendClientMessage(playerid, BLUE, "You have successfully logged in to your account."); } else { return SendClientMessage(playerid,ORANGE, "ERROR: Incorrect password."); } } } dcmd_logout(playerid, params[]) { #pragma unused params if(gPlayerInfo[playerid][PLAYER_REGGED] != 1) { return SendClientMessage(playerid, ORANGE, "ERROR: You must register first to do that! Use /register [password] to register."); } else if(gPlayerInfo[playerid][PLAYER_LOGGED] == 0) { return SendClientMessage(playerid, ORANGE, "ERROR: You are already logged-out."); } else { gPlayerInfo[playerid][PLAYER_LOGGED] = 0; return SendClientMessage(playerid, BLUE, "You have successfully logged out of your account."); } } dcmd_password(playerid, params[]) { if(gPlayerInfo[playerid][PLAYER_REGGED] != 1) { return SendClientMessage(playerid, ORANGE, "ERROR: You must register first to do that! Use /register [password] to register and login."); } else if(gPlayerInfo[playerid][PLAYER_LOGGED] == 0) { return SendClientMessage(playerid, ORANGE, "ERROR: You must be logged-in to do that! Use /login [password] to login."); } else { new tmp[256], tmp2[256], index; tmp = strtok(params, index); if(!strlen(tmp)) { return SendClientMessage(playerid, ORANGE, "USAGE: /password [password] [new password]"); } tmp2 = strtok(params, index); if(!strlen(tmp2)) { return SendClientMessage(playerid, ORANGE, "USAGE: /password [password] [new password]"); } new oldpassword = num_hash(tmp), newpassword = num_hash(tmp2); if(gPlayerInfo[playerid][PLAYER_PASS] == oldpassword) { if(oldpassword == newpassword) { return SendClientMessage(playerid, ORANGE, "ERROR: Your old password can not be the same as your new password."); } else if(strlen(tmp2) < gSettings[PASS_MIN] || strlen(tmp2) > gSettings[PASS_MAX]) { new string[100]; format(string, sizeof(string), "ERROR: Your new password must be between %d and %d characters long!", gSettings[PASS_MIN], gSettings[PASS_MAX]); return SendClientMessage(playerid, ORANGE, string); } gPlayerInfo[playerid][PLAYER_PASS] = newpassword; new string[128]; format(string, sizeof(string), "You have successfully changed your password from \'%s\' to \'%s\'.", tmp, tmp2); return SendClientMessage(playerid, BLUE, string); } else { return SendClientMessage(playerid, ORANGE, "ERROR: Incorrect password."); } } } dcmd_akill(playerid, params[]) { if(gPlayerInfo[playerid][PLAYER_LEVEL] < gCommands[AKILL]) { new string[100]; format(string, sizeof(string), "You must be administrator level %d to use that command!", gCommands[AKILL]); return SendClientMessage(playerid, ORANGE, string); } else if(!strlen(params)) { return SendClientMessage(playerid, ORANGE, "USAGE: /akill [id | name]"); } else { new id = strval(params); if(IsPlayerConnected(id) && id != playerid) { SetPlayerHealth(id, 0.0); new string[128]; format(string, sizeof(string), "You have been admin-killed by administrator \'%s\'.", gPlayerInfo[playerid][PLAYER_NAME]); SendClientMessage(id, ORANGE, string); format(string, sizeof(string), "You have successfully admin-killed player \'%s\'.", gPlayerInfo[id][PLAYER_NAME]); return SendClientMessage(playerid, BLUE, string); } else { return SendClientMessage(playerid, ORANGE, "ERROR: You can not admin-kill yourself or a disconnected player."); } } } dcmd_announce(playerid, params[]) { if(gPlayerInfo[playerid][PLAYER_LEVEL] < gCommands[ANNOUNCE]) { new string[100]; format(string, sizeof(string), "You must be administrator level %d to use that command!", gCommands[ANNOUNCE]); return SendClientMessage(playerid, ORANGE, string); } else if(!strlen(params)) { return SendClientMessage(playerid, ORANGE, "USAGE: /announce [message]"); } else { return GameTextForAll(params, gSettings[ANNOUNCE_SECONDS] * 1000, 3); } } public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) { return 1; } public OnPlayerExitVehicle(playerid, vehicleid) { return 1; } public OnPlayerStateChange(playerid, newstate, oldstate) { return 1; } public OnPlayerEnterCheckpoint(playerid) { return 1; } public OnPlayerLeaveCheckpoint(playerid) { return 1; } public OnPlayerEnterRaceCheckpoint(playerid) { return 1; } public OnPlayerLeaveRaceCheckpoint(playerid) { return 1; } public OnRconCommand(cmd[]) { return 1; } public OnPlayerRequestSpawn(playerid) { return 1; } public OnObjectMoved(objectid) { return 1; } public OnPlayerObjectMoved(playerid, objectid) { return 1; } public OnPlayerPickUpPickup(playerid, pickupid) { return 1; } public OnVehicleMod(playerid, vehicleid, componentid) { return 1; } public OnVehiclePaintjob(playerid, vehicleid, paintjobid) { return 1; } public OnVehicleRespray(playerid, vehicleid, color1, color2) { return 1; } public OnPlayerSelectedMenuRow(playerid, row) { return 1; } public OnPlayerExitedMenu(playerid) { return 1; } public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) { return 1; } public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { return 1; } public OnRconLoginAttempt(ip[], password[], success) { return 1; } public OnPlayerUpdate(playerid) { return 1; } public OnPlayerStreamIn(playerid, forplayerid) { return 1; } public OnPlayerStreamOut(playerid, forplayerid) { return 1; } public OnVehicleStreamIn(vehicleid, forplayerid) { return 1; } public OnVehicleStreamOut(vehicleid, forplayerid) { return 1; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { return 1; } public OnPlayerClickPlayer(playerid, clickedplayerid, source) { return 1; } stock isNumeric(const string[]) { new length=strlen(string); if (length==0) return false; for (new i = 0; i < length; i++) { if ( (string[i] > '9' || string[i] < '0' && string[i]!='-' && string[i]!='+') // Not a number,'+' or '-' || (string[i]=='-' && i!=0) // A '-' but not at first. || (string[i]=='+' && i!=0) // A '+' but not at first. ) return false; } if (length==1 && (string[0]=='-' || string[0]=='+')) return false; return true; }