Открываешь ea/src/map/atcommand.c , ищешь эти строки: #include "../custom/atcommand.inc" /** * Fills the reference of available commands in atcommand DBMap **/ Перед ними вставляешь это: /* @ipban by Griniy. */ /* Updated by Oxxy */ ACMD_FUNC(ipban) { struct map_session_data *pl_sd; char *modif_p, *data, *last_ip; int month, value = 0; char ip[16]; nullpo_retr(-1, sd); memset(atcmd_output, '\0', sizeof(atcmd_output)); memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); if(!message || !*message || sscanf(message, "%199s %99[^\n]", atcmd_output, atcmd_player_name) < 2) { clif_displaymessage(fd, msg_txt(1600)); return -1; } atcmd_output[sizeof(atcmd_output)-1] = '\0'; modif_p = atcmd_output; month = 0; while (modif_p[0] != '\0') { value = atoi(modif_p); if(value == 0) modif_p++; else { if(modif_p[0] == '-' || modif_p[0] == '+') modif_p++; while(modif_p[0] >= '0' && modif_p[0] <= '9') { modif_p++; if(modif_p[0] == 'm') { month = value; modif_p++; } else if (modif_p[0] != '\0') { modif_p++; } } } } if(month == 0) { clif_displaymessage(fd, msg_txt(1601)); return -1; } if(SQL_ERROR == Sql_Query(mmysql_handle, "SELECT `last_ip` From `login`, `char` WHERE login.account_id = char.account_id AND char.name = '%s'", atcmd_player_name ) ) Sql_ShowDebug(mmysql_handle); if(Sql_NumRows(mmysql_handle) == 0) { clif_displaymessage(fd, msg_txt(1602)); Sql_FreeResult(mmysql_handle); return -1; } Sql_NextRow(mmysql_handle); Sql_GetData(mmysql_handle, 0, &data, NULL); last_ip = data; strcpy(ip, last_ip); Sql_FreeResult(mmysql_handle); if(Sql_NumRows(mmysql_handle) > 0) { clif_displaymessage(fd, msg_txt(1603)); Sql_FreeResult(mmysql_handle); return -1; } else Sql_FreeResult(mmysql_handle); if(SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `ipbanlist` (`list`,`btime`,`rtime`,`reason`) VALUES ('%s', NOW() , NOW() + INTERVAL %d MONTH ,'AtCommand ban for user name : %s')", ip, month, atcmd_player_name)) Sql_ShowDebug(mmysql_handle); if(map_nick2sd(atcmd_player_name)) clif_GM_kick(sd, map_nick2sd(atcmd_player_name)); return 0; } и это : /* @unbaip by Griniy */ /* Updated by Oxxy */ ACMD_FUNC(unbanip) { char *data, *last_ip, ip[16], output[255]; nullpo_retr(-1, sd); memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); if (!message || !*message || (sscanf(message, "%23[^\n]", atcmd_player_name) < 1)) { clif_displaymessage(fd, msg_txt(1604)); return -1; } if( SQL_ERROR == Sql_Query(mmysql_handle, "SELECT `last_ip` FROM `login`, `char` WHERE login.account_id = char.account_id AND char.name = '%s'",atcmd_player_name) ) { Sql_ShowDebug(mmysql_handle); Sql_FreeResult(mmysql_handle); return -1; } if( Sql_NumRows(mmysql_handle) == 0 ) { clif_displaymessage(fd, msg_txt(1602)); Sql_FreeResult(mmysql_handle); return -1; } Sql_NextRow(mmysql_handle); Sql_GetData(mmysql_handle, 0, &data, NULL); last_ip = data; strcpy(ip, last_ip); if( SQL_ERROR == Sql_Query(mmysql_handle, "SELECT * FROM `ipbanlist` WHERE `list` = '%s'",ip) ) { Sql_ShowDebug(mmysql_handle); Sql_FreeResult(mmysql_handle); return -1; } if( Sql_NumRows(mmysql_handle) == 0 ) { clif_displaymessage(fd, msg_txt(1605)); Sql_FreeResult(mmysql_handle); return -1; } if( SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `ipbanlist` WHERE `list` = '%s'",ip) ) { Sql_ShowDebug(mmysql_handle); Sql_FreeResult(mmysql_handle); return -1; } sprintf(output, msg_txt(1606),atcmd_player_name); clif_displaymessage(fd, output); return 0; } Далее открываешь ea/src/map/map.c и ищешь эту строку: #define MAP_MAX_MSG 1600 Меняешь на эту: #define MAP_MAX_MSG 2000 Далее заходишь в ea/conf/map_msg_add.conf и добавляешь эти строки: 1600: Please, enter ban time and a player name (usage: @ipban <time> <name>). 1601: Invalid time for ban command. 1602: Unknown character name. Please check it and repeat. 1603: This characters is already banned by IP. 1604: Please, enter a player name to unban (usage: @unbanip <name>). 1605: No character with such name was found in Banlist. 1606: Character %s was succesfully unbanned. После, компилируешь.