|
Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/
Работа с массивами
|
|
Hafner | Дата: Вторник, 30.06.2009, 11:18:38 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 46
Статус: Не в сети
| Всех приветствую, прошу помощи в следующем вопросе: Имеем код из admin.sma , необходимо в NameData поместить всё из столбца "name", а в другой функции вывести всё содержимое массива Code BlockedCount = 0
new NameData[44] new qcolName = SQL_FieldNameToNum(query, "name")
while (SQL_MoreResults(query)) { SQL_ReadResult(query, qcolName, NameData, sizeof(NameData)-1);
++BlockedCount;
SQL_NextRow(query) } SQL_FreeHandle(query) SQL_FreeHandle(sql) SQL_FreeHandle(info) NameData я задал глобально, но почему-то выводит только одну строку (самую последнюю запись в таблице)
|
|
| |
slogic | Дата: Вторник, 30.06.2009, 13:53:35 | Сообщение # 2 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| ты в цикле засовываешь в один и тот же массив значение поля name из очередной строки выборки, которую вернул запрос. либо тут же выводи (и забудь про массив), либо тебе придется использовать динамические массивы из 1.8.x.
|
|
| |
Hafner | Дата: Вторник, 30.06.2009, 13:57:04 | Сообщение # 3 |
Лейтенант
Группа: Пользователи
Сообщений: 46
Статус: Не в сети
| slogic, спасибо, а где можно почитать про динамические массивы? Вариант с выводом в цикле никак не подходит...
|
|
| |
slogic | Дата: Вторник, 30.06.2009, 14:18:03 | Сообщение # 4 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Просмотрел cellarray.inc, навреное примерно вот так: new Array:arr = ArrayCreate(44) // в цикле... ArrayPushString(arr, sizeof(NameData)-1) // чтение... ArrayGetString(arr, index, sTemp, sizeof(sTemp) - 1) Я ими не пользовался, так что от чего отсчитываются элементы (от 0 или 1) сам определи.
|
|
| |
Hafner | Дата: Вторник, 30.06.2009, 16:55:01 | Сообщение # 5 |
Лейтенант
Группа: Пользователи
Сообщений: 46
Статус: Не в сети
| slogic, благодарю! Сделал так: Code new Array:arr
public plugin_init() { arr = ArrayCreate(44) }
public players_blocked() { new table[32], error[128], type[12], errno new Handle:info = SQL_MakeStdTuple() new Handle:sql = SQL_Connect(info, errno, error, 127) get_cvar_string("amx_sql_blocked", table, 31) SQL_GetAffinity(type, 11) if (sql == Empty_Handle) { server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_CON", error) return PLUGIN_HANDLED }
new Handle:query if (equali(type, "sqlite")) { if (!sqlite_TableExists(sql, table)) { SQL_QueryAndIgnore(sql, "CREATE TABLE %s ( name TEXT NOT NULL DEFAULT '' )", table) }
query = SQL_PrepareQuery(sql, "SELECT name FROM %s", table) } else { SQL_QueryAndIgnore(sql, "CREATE TABLE %s ( `id` int(11) NOT NULL auto_increment, `name` varchar(32) NOT NULL default '' )", table) query = SQL_PrepareQuery(sql,"SELECT `name` FROM `%s`", table) }
if (!SQL_Execute(query)) { SQL_QueryError(query, error, 127) server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_BLOCKED", error) } else if (!SQL_NumResults(query)) { server_print("[AMXX] %L", LANG_SERVER, "NO_BLOCKED") } else { BlockedCount = 0 new qcolName = SQL_FieldNameToNum(query, "name")
while (SQL_MoreResults(query)) { SQL_ReadResult(query, qcolName, NameData, sizeof(NameData)-1); ArrayPushString(arr, NameData)
++BlockedCount;
SQL_NextRow(query) } SQL_FreeHandle(query) SQL_FreeHandle(sql) SQL_FreeHandle(info) } return PLUGIN_HANDLED } Далее вывожу, допустим: Code new buff[44]; for (new ib=0; ib<10; ib++) { ArrayGetString(arr, ib, buff, sizeof(buff)-1); server_print("%s",buff) } Всё норм выводится, остается последний вопрос, как можно посчитать количество значений в массиве, дабы использовать в последнем цикле?
Сообщение отредактировал Hafner - Вторник, 30.06.2009, 16:55:52 |
|
| |
PomanoB | Дата: Вторник, 30.06.2009, 16:59:51 | Сообщение # 6 |
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| new size = ArraySize(arr)
http://romanov4400.mybrute.com
|
|
| |
Koka | Дата: Вторник, 30.06.2009, 20:32:35 | Сообщение # 7 |
Полковник
Группа: Пользователи
Сообщений: 169
Статус: Не в сети
| вместо этого Code new buff[44]; for (new ib=0; ib<10; ib++) { ArrayGetString(arr, ib, buff, sizeof(buff)-1); server_print("%s",buff) } можно так Code for (new ib=0; ib<10; ib++) { server_print("%a",ArrayGetStringHandle(arr, ib)) } http://amxmodx.ucoz.ru/forum/12-3028-1
стал ощущать рефлексы тоньше, оставаясь как всегда с идеей той же...
Сообщение отредактировал Koka - Вторник, 30.06.2009, 20:33:06 |
|
| |
Hafner | Дата: Четверг, 02.07.2009, 19:25:25 | Сообщение # 8 |
Лейтенант
Группа: Пользователи
Сообщений: 46
Статус: Не в сети
| Спасибо всем! Доработал плагин до смены ника игрокам, у которых ник совпадает с указанным в таблице: Code new buff[44] new sizeData = ArraySize(arr) for (new ib=0; ib<sizeData; ib++) { ArrayGetString(arr, ib, buff, sizeof(buff)-1);
if (equali(username,buff)) { client_cmd(id, "setinfo name ^"%s^"", "ChangeNICK") set_user_info(id, "name", "ChangeNICK") break } } Но возникла проблема, смена ника срабатывает только со второго раза и её легко можно обойти, то есть: - нажимаю в игре дисконнект, в консоли пишу "name Admin", спокойно захожу на сервер с, по идее, заблокированным ником. - если снова нажать на дисконнект и заного зайти на сервер без смены ника, то ник меняется плагином. Прошу помочь, хотя бы где копать? Добавлено (2009-07-02, 7:25 Pm) --------------------------------------------- Идей нет никаких? Тогда вопрос, достаточно ли с помощью client_cmd сменить ник у определенного игрока?
|
|
| |
PAHANCS | Дата: Пятница, 03.07.2009, 03:17:18 | Сообщение # 9 |
Полковник
Группа: Пользователи
Сообщений: 183
Статус: Не в сети
| Quote (Hafner) возникла проблема, смена ника срабатывает только со второго раза и её легко можно обойти Правда я незнаю откудо взялась переменная "arr" и "ChangeNICK" сам подставиш, опробуй это: Code public client_infochanged(id) { new data0[32], data1[32] read_argv(0, data0 31) read_argv(1, data1, 31) if(equali(data0, "setinfo") && equali(data1, "name")) { new buff[44], data2[32] new sizeData = ArraySize(arr) read_argv(2, data2, 31) for(new ib=0; ib<sizeData; ib++) { ArrayGetString(arr, ib, buff, sizeof(buff)-1) if(equali(data2, buff)) { client_cmd(id, "setinfo name ^"%s^"", "ChangeNICK") set_user_info(id, "name", "ChangeNICK") // я думаю это необязательно, предыдущая команда выполняет всё нужное. break } } } return PLUGIN_CONTINUE }
PAHANCS
|
|
| |
Hafner | Дата: Среда, 29.07.2009, 17:01:15 | Сообщение # 10 |
Лейтенант
Группа: Пользователи
Сообщений: 46
Статус: Не в сети
| PAHANCS, спс за идею, проблему решил, ник меняется отлично и ВСЕГДА, если совпадает с указанным в таблице, НО теперь есть другая трабла... Писал в этой теме http://amxmodx.ucoz.ru/forum/16-3189-1 , но там обсуждалась совсем другая проблема, поэтому все как-то проигнорили. Вобщем проблема в следующем - после смены строчки: Code get_user_info(id, "name", newname, 31) на: Code get_user_info(id, "[color=red]setinfo[/color] name", newname, 31) в функции client_infochanged: Code public client_infochanged(id) { if (!is_user_connected(id) || !get_pcvar_num(amx_mode)) { return PLUGIN_CONTINUE }
new newname[32], oldname[32] get_user_name(id, oldname, 31) get_user_info(id, "setinfo name", newname, 31)
if (g_CaseSensitiveName[id]) { if (!equal(newname, oldname)) { accessUser(id, newname) } } else { if (!equali(newname, oldname)) { accessUser(id, newname) } } return PLUGIN_CONTINUE } у меня в консоле клиента при соединении с сервером дублируются сообщения: Code Connecting to 127.0.0.1:27015... Connection accepted by 127.0.0.1:27015 * Privileges set BUILD 4554 SERVER (0 CRC) Server # 476 Player connected * Privileges set * Privileges set Player is joining the Counter-Terrorist force Scoring will not start until both teams have players * Privileges set В принципе всё работает, но этот спам напрягает и мне кажется, что тут где-то ошибка. Очень прошу глянуть и подсказать, это нормально или нет, а если так типа и должно быть, то как избавиться от спама в консоль - тупо удалить строчку: Code client_cmd(id, "echo ^"* %L^"", id, "PRIV_SET") ????? P.S. если нужен полный код плагина, то я выкладывал его в теме указанной выше.
|
|
| |
PAHANCS | Дата: Среда, 29.07.2009, 19:01:40 | Сообщение # 11 |
Полковник
Группа: Пользователи
Сообщений: 183
Статус: Не в сети
| Quote (Hafner) get_user_info(id, "setinfo name", newname, 31) Нет такой инфы у клиента "setinfo name", этим способом устанавливается, к примеру client_cmd(id, "setinfo name ^"%s^"", "ChangeNICK"), за место этого надо просто "name" : get_user_info(id, "name", newname, 31) так что ты зря менял эту строчку, скорей всего из-за неё и дублирует.
PAHANCS
|
|
| |
Hafner | Дата: Среда, 29.07.2009, 19:31:44 | Сообщение # 12 |
Лейтенант
Группа: Пользователи
Сообщений: 46
Статус: Не в сети
| Quote (PAHANCS) так что ты зря менял эту строчку, скорей всего из-за неё и дублирует. Так если в той строчке оставить name, то ник меняется со второго раза и обходится свободно.
|
|
| |
PAHANCS | Дата: Среда, 29.07.2009, 19:38:25 | Сообщение # 13 |
Полковник
Группа: Пользователи
Сообщений: 183
Статус: Не в сети
| Quote (Hafner) Так если в той строчке оставить name, то ник меняется со второго раза и обходится свободно Я уже запутался что тебе надо, если тебе надо установить то надо с помощью этого: set_user_info(id, "name", "ChangeNICK")
PAHANCS
|
|
| |
PAHANCS | Дата: Среда, 29.07.2009, 20:03:07 | Сообщение # 14 |
Полковник
Группа: Пользователи
Сообщений: 183
Статус: Не в сети
| Ни чего не изменяя просто замени свою функцию на мою и попробуй:
PAHANCS
Сообщение отредактировал PAHANCS - Среда, 29.07.2009, 20:05:14 |
|
| |
Hafner | Дата: Среда, 29.07.2009, 22:38:47 | Сообщение # 15 |
Лейтенант
Группа: Пользователи
Сообщений: 46
Статус: Не в сети
| Этот код убирает дубли в консоле, но и со старым этого тоже не было. Мне же нужно, чтобы НЕ БЫЛО спама в консоле и чтобы ВСЕГДА переименовывались ники из базы =/
|
|
| |
| AMX Mod X Russian Community © 2006-2024 | |
|
| |